Sie immer Anführungszeichen um Variablen in allen brauchen Liste Kontexten, die überall die Variable kann auf mehrere Werte erweitert werden , wenn Sie die 3 Nebenwirkungen des Ausscheidens eine variable unquoted wollen.
Liste Kontexte umfassen Argumente einfache Befehle wie [
oder echo
, die for i in <here>
Zuweisungen zu Arrays ... Es gibt andere Kontexte , in denen Variablen auch zitiert werden müssen. Am besten zitieren Sie Variablen immer, es sei denn, Sie haben einen guten Grund, dies nicht zu tun.
Stellen Sie sich das Fehlen von Anführungszeichen (in Listenkontexten) als den Operator split + glob vor .
Als ob echo $test
war echo glob(split("$test"))
.
Das Shell-Verhalten ist für die meisten Leute verwirrend, weil Sie in den meisten anderen Sprachen feste Zeichenfolgen in Anführungszeichen setzen puts("foo")
und nicht Variablen (wie puts(var)
), während es in der Shell umgekehrt ist: Alles ist Zeichenfolge in der Shell, also Anführungszeichen um alles wäre umständlich, du echo test
musst nicht "echo" "test"
. In der Shell werden Anführungszeichen für etwas anderes verwendet: Verhindern Sie eine spezielle Bedeutung einiger Zeichen und / oder beeinflussen Sie das Verhalten einiger Erweiterungen.
In [ -n $test ]
oder echo $test
wird die Shell geteilt $test
(standardmäßig in Leerzeichen) und anschließend die Dateinamengenerierung ausgeführt (alle *
Muster '?' ... in die Liste der übereinstimmenden Dateien einblenden) und diese Liste der Argumente an die Befehle [
oder übergeben echo
.
Betrachten Sie es erneut als "[" "-n" glob(split("$test")) "]"
. Wenn $test
leer oder enthält nur Leerzeichen (spc, Tab, nl), dann wird die Split + glob Operator eine leere Liste zurück, so das [ -n $test ]
sein wird "[" "-n" "]"
, das ist ein Test, um zu überprüfen wheter „-n“ die leere Zeichenkette ist oder nicht. Aber stellen Sie sich vor, was passiert wäre, wenn $test
"*" oder "= foo" wäre ...
In [ -n "$test" ]
, [
wird die vier Argumente übergeben "["
, "-n"
, ""
und "]"
(ohne die Anführungszeichen), das ist , was wir wollen.
Ob es echo
oder [
keinen Unterschied macht, dann ist es nur , dass echo
Ausgänge die gleiche Sache , ob es ein leeres Argument oder kein Argument überhaupt übergeben wird .
Siehe auch diese Antwort auf eine ähnliche Frage für weitere Details zum [
Befehl und zum [[...]]
Konstrukt.
echo
angeben, die als Argument verwendet werden soll, werden zusätzliche Leerzeichen und Zeilenumbrüche entfernt.