Wat is het verschil tussen enkele en dubbele aanhalingstekens in de Bash-shell?
Het tussenvoegen van tekst tussen aanhalingstekens is tamelijk standaard op de opdrachtregel, vooral als het gaat om bestanden met spaties in de namen, maar hoe weet u of u enkele of dubbele aanhalingstekens wilt gebruiken? Laten we eens kijken naar het verschil, en wanneer u de een tegen de ander zou moeten gebruiken.
De algemene regel is dat dubbele aanhalingstekens nog steeds uitbreiding van variabelen binnen de aanhalingstekens toestaan, en enkele aanhalingstekens niet. Blijf lezen.
Citaten met eenvoudige tekst
Als je gewoon een paar woorden tekst insluit, maakt het eigenlijk niet uit welke je gebruikt, omdat ze allebei precies hetzelfde werken. Deze twee opdrachten zullen bijvoorbeeld allebei een map maken met de naam Testdirectory:
mkdir "Test Directory"
mkdir 'Test Directory'
Meer ervaren types zullen waarschijnlijk opmerken dat je mkdir Test \ Directory ook zou kunnen gebruiken als je wilde.
Shell Variabele Uitbreiding
Het verschil tussen enkele en dubbele aanhalingstekens wordt belangrijker als je te maken hebt met variabelen op de opdrachtregel. Standaard gaat bash een variabele als $ test uitbreiden naar de volledige reeks. Eerst zullen we de variabele toewijzen:
test = "Dit is een test"
Nu kunt u deze variabele op de opdrachtregel gebruiken, zoals deze, die gewoon moet worden uitgevoerd Dit is een test naar de console:
echo $ test
Hier wordt het verschil tussen dubbele en enkele aanhalingstekens duidelijker: wanneer u enkele aanhalingstekens gebruikt, worden de variabelen niet uitgebreid. Bijvoorbeeld als u deze opdracht uitvoert:
echo '$ test'
U ziet niets anders dan '$ test' op de opdrachtregel wanneer u enkele aanhalingstekens gebruikt, maar deze wordt correct uitgevoerd wanneer u dubbele aanhalingstekens gebruikt:
Hetzelfde werkt als u het 'teken' gebruikt om een opdracht op de opdrachtregel uit te vouwen. Stel dat u de. Wilt gebruiken pwd commando van binnen een ander commando-je zou backticks gebruiken om de shell te vertellen om het uit te breiden:
echo 'pwd' / test
Als je in je thuismap zat, zou je uitvoer zien die er zo uitzag:
/ Home / geek / test
Stel dat u zich bijvoorbeeld in een map bevindt met een spatie in het pad en dat u de opdracht ln wilt gebruiken om een symbolische koppeling naar een bestand in de huidige map te maken. Meestal moet u het volledige pad opgeven wanneer u de opdracht ln gebruikt, dus het is veel gemakkelijker om 'pwd' te gebruiken om typen te besparen.
Kijk wat er gebeurt als je het commando probeert te gebruiken zonder tussen aanhalingstekens te zetten:
ln -s 'pwd' / test / home / geek / linkedname
In plaats daarvan moet je tussen aanhalingstekens plaatsen:
ln -s "'pwd' / filename" / some / other / path
Laten we voor een concreter voorbeeld aannemen dat we een mapstructuur hebben zoals dit voorbeeld, waarin alle bestandsnamen spaties bevatten:
Omdat de opdracht unzip het gebruik van * niet ondersteunt om het tegen alle bestanden uit te voeren, moet u in plaats hiervan de opdracht for gebruiken. Dit is waar dingen interessant worden:
voor f in * .zip; unzip $ f; done
Oops! Het lijkt erop dat het niet werkte.
Wat we in plaats daarvan moeten doen is gebruik dubbele aanhalingstekens rond de $ f variabele, zoals deze:
voor f in * .zip; unzip "$ f"; klaar
Nu gaat elke keer het commando for door de lus heen om een opdracht als deze daadwerkelijk uit te voeren:
unzip "test 1.zip"
Natuurlijk zou het doorlopen en een vergelijkbare opdracht uitvoeren voor elk bestand in de map.
Laten we beoordelen
Nu we de voorbeelden hebben doorgenomen, zullen we het snel beoordelen voor het geval u het heeft gemist:
Dubbele aanhalingstekens
- Gebruik dit wanneer u variabelen wilt invoegen of shell-uitbreiding binnen een string wilt gebruiken.
- Alle tekens binnenin worden geïnterpreteerd als normale tekens, behalve voor $ of ', die in de shell worden uitgebreid.
Enkele offertes
- Alle tekens binnen enkele aanhalingstekens worden geïnterpreteerd als een tekenreeks.
En zo eindigt de les van de citaten. Gebruik ze verstandig.