it-swarm.com.de

Warum in einem [[]] Test doppelte Anführungszeichen verwenden?

Angenommen, wir haben 2 Ganzzahlen in einem Bash-Skript:

value1=5
value2=3

Warum müssen wir dann im Falle eines Tests doppelte Anführungszeichen verwenden? Zum Beispiel:

if [[ "$value1" -eq "$value2" ]]

Warum nicht einfach das Folgende verwenden?

if [[ $value1 -eq $value2 ]]

Für mich ergeben die doppelten Anführungszeichen keinen Sinn.

23
Meerkat

Wortspaltung.

Dieses Beispiel ist sehr unwahrscheinlich, aber möglich Wenn Sie also defensiv codieren möchten, bedecken Sie Ihre Tracks mit Anführungszeichen:

$ set -x
$ value1=5
+ value1=5
$ value2=3
+ value2=3
$ [ $value1 -eq $value2 ]
+ '[' 5 -eq 3 ']'

OK, alles gut soweit. Lassen Sie uns den Schraubenschlüssel in die Zahnräder werfen:

$ IFS=456
+ IFS=456
$ [ $value1 -eq $value2 ]
+ '[' '' -eq 3 ']'
bash: [: : integer expression expected

Hoppla.

$ [ "$value1" -eq "$value2" ]
+ '[' 5 -eq 3 ']'

Ahh.

7
glenn jackman

Sie brauchen die Zitate hier eigentlich nicht. Dies ist einer der wenigen Fälle, in denen die Verwendung einer nicht zitierten Variablen sicher ist. Sie können dies mit set -x Bestätigen:

$ var1=""
$ var2="3"
$ set -x
$ if [[ $var1 -eq $var2 ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!
$ if [[ "$var1" -eq "$var2" ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!

Wie Sie oben sehen können, werden die zitierten und nicht zitierten Versionen des Tests durch Bash auf genau dasselbe aufgelöst. Das gleiche sollte für zsh und, glaube ich, jede andere Shell gelten, die den Operator [[ ]] Unterstützt.

Beachten Sie, dass dies nicht der Fall ist mit dem portableren [ ]:

$ if [ $var1 -eq $var2 ]; then echo "match!"; else echo "no match!"; fi
+ '[' -eq 3 ']'
sh: [: -eq: unary operator expected
+ echo 'no match!'
no match!

Das Konstrukt [ ] Erfordert im Gegensatz zum Konstrukt [[ ]] Ein Anführungszeichen.


Einige nützliche Links, um mehr darüber zu erfahren, wann und warum Zitate erforderlich sind:

35
terdon

Obwohl die doppelten Anführungszeichen nicht erforderlich sind, gibt es folgende Gründe:

  • Gute Praxis/Gewohnheit: In diesem Fall sind sie nicht notwendig, aber im Allgemeinen doppelte Anführungszeichen sind, um eine unbeabsichtigte Wortaufteilung zu vermeiden.
  • Weil value1 Und value2 Variabel sind und Sie möglicherweise nicht wissen, was sie enthalten. Andernfalls könnten Sie genauso gut fragen: "Warum sich mit Variablen beschäftigen, anstatt if [[ 5 -eq 3 ]] Zu prüfen? Oder weiter gehen, warum sich überhaupt mit if beschäftigen, wenn Sie bereits wissen, dass 5 nicht gleich ist 3? Es ist oft besser, defensiv zu sein. (Es ist wahr, dass die Wortaufteilung in [[ Nicht vorkommt, aber Fälle, in denen die Wortaufteilung nicht vorkommt, sind selten der erste Punkt.)
16
jamesdlin

Du liegst absolut richtig!

Das Anführungszeichen in doppelten eckigen Klammern macht zumindest in diesem Fall überhaupt keinen Sinn.

Aber da ich täglich doppelte Anführungszeichen verwende - insbesondere für Ausdrücke in einfachen eckigen Klammern, manchmal Übergabe von Argumenten an Funktionen und Skripte sowie für die Zuweisung von Variablen (was für einfache Delkarationen völlig nutzlos ist) - ich denke, einige Leute bei Zumindest schreibe ich instinktiv doppelte Anführungszeichen um Variablenerweiterungen.

Doppelte Zitate können Ihnen ein Gefühl der Sicherheit geben. Es ist wie nach Hause zu kommen, wo doppelte Anführungszeichen stehen. - D. Kummer

Ein Vorteil von doppelten Anführungszeichen konsequent und verständlich - aber nur so, wie es Sinn macht - ist, dass Mitarbeiter, die neu in der Bash sind, lernen können wie man stabilere Skripte schreibt. Es wird auch die Tatsache betont, dass die Kunst der Datenverarbeitung mit bash mehr mit Trennen von Datenströmen (einschließlich Variablen) durch Feldtrennzeichen und Pipe - zu tun hat sie durch Filter. Sobald Sie Ihre Datenblöcke vom Stream getrennt haben, halten Sie sie mit doppelten Anführungszeichen zusammen!

Ein weiterer Vorteil könnte die bessere Lesbarkeit von Bash-Skripten mit Zeichenfolgen in doppelten Anführungszeichen sein in einem Code-Hervorhebungs-Editor.

1
Dominik Kummer

Nicht direkt mit Ihrer Frage verbunden, aber ich benutze

if (($ value1 == $ value2)); dann

wenn ich Zahlen vergleiche, müssen Sie dort aber auch keine Anführungszeichen verwenden.

1
framp