z.B
if [ "$FOO" = "true" ]; then
vs.
if [ $FOO = "true" ]; then
Was ist der Unterschied? Scheint, dass beide Aussagen auch funktionieren.
bash
shell
shell-script
quoting
Ryan
quelle
quelle
a='foo bar'; [[ $a == "foo bar" ]]
. Eine Variable, die keine Glob-Zeichen enthält, muss jedoch nicht sein :[[ $a == $a ]]
. Die Worterweiterung wird nicht in doppelten eckigen Klammern ausgeführt. Und für Regex Matching, das Muster auf der rechten Seite darf nicht zitiert werden , oder es wird als Zeichenkette entnommen werden:[[ $a =~ .*oo.*r ]]
(das Muster in einem nicht genannten variabel sein sollte, aber stattdessen ...[[ $a == foo* ]]
. Können Sie neben meinem Beispiel für eine wörtliche Zeichenfolge weitere Beispiele für eine Anforderung zum Zitieren angeben?Antworten:
Wenn der Wert von
$FOO
ein einzelnes Wort ist, das kein Platzhalterzeichen enthält\[*?
, sind die beiden identisch.Wenn
$FOO
es nicht zugewiesen oder leer ist oder mehr als ein Wort enthält (dh Leerzeichen oder enthält$IFS
), ist die nicht zitierte Version ein Syntaxfehler. Wenn es sich um genau die richtige Folge von Wörtern handelt (z. B.0 -eq 0 -o false
), kann das Ergebnis beliebig sein. Daher empfiehlt es sich, Variablen immer in Shell-Skripten anzugeben.Muss übrigens
"true"
nicht zitiert werden.quelle
Um zu veranschaulichen, welche Probleme dies verursachen könnte, hier einige Beispiele.
Angenommen, wir haben zwei Variablen wie folgt:
Jetzt haben wir zwei Variablen, die genau den gleichen String / Wert enthalten. Wenn wir einige if-Anweisungen gemacht haben, um das Ergebnis zu testen, in Ihrem Fall:
An diesem Punkt werden Sie bekommen
bash: [: too many arguments
. Das nicht zitierte $ FOO enthält jetzt drei Werte, nämlich'[ , some , value'
.[
Das Schlüsselwort test weiß nicht, was ausgeführt werden soll, da erwartet wird, dass das erste oder zweite Argument ein Operator ist.Wenn wir "$ FOO" zitieren, sagen wir ausdrücklich, dass wir uns
if
die richtigen Werte ansehen sollen, bei denen keine Wortteilung stattfindet.Ein anderes Beispiel:
rm $my_file
bedeutet, 'A' 'random' 'file.txt' zu entfernen, wodurch drei Dateien entstehen.rm "$my_file"
Wenn Sie dies tun, wird "A random file.txt" entfernt, wodurch eine Datei erstellt wird.Ich hoffe, ich habe Sie nicht mit diesen Beispielen verwechselt.
quelle
In diesem speziellen Fall gibt es keinen Unterschied.
Wenn Sie jedoch
$FOO
ein Leerzeichen oder einige Sonderzeichen enthalten, liegt ein Problem vor.In diesem
"$FOO"
Fall wird die Variable insgesamt verwendet, damit die Übereinstimmung Sie vom Platzproblem isoliert.Wenn Sie jedoch verwenden
$FOO
und es einen Sonderfall gibt, wirkt sich dies auf die if-Anweisung aus.quelle