Nehmen wir an, wir haben zwei Ganzzahlen in einem Bash-Skript:
value1=5
value2=3
Warum müssen wir dann im Falle eines Tests doppelte Anführungszeichen verwenden? Beispielsweise:
if [[ "$value1" -eq "$value2" ]]
Warum nicht einfach folgendes verwenden?
if [[ $value1 -eq $value2 ]]
Für mich machen die doppelten Anführungszeichen keinen Sinn.
5
und notwendig ist3
, ist Wartbarkeit. Die Werte können sich später ändern und die daraus resultierenden Fehler sind möglicherweise nicht offensichtlich.[[ ]]
, nur für[ ]
.[[ ]]
dieser Variablen werden auch die Operanden-eq
in ganze Zahlen umgewandelt.Antworten:
Wortteilung.
Dieses Beispiel ist sehr unwahrscheinlich, aber möglich . Wenn Sie also defensiv codieren möchten, müssen Sie Ihre Tracks mit Anführungszeichen versehen:
OK, soweit alles gut. Lassen Sie uns den Schraubenschlüssel in die Zahnräder werfen:
Hoppla.
Ahh.
quelle
[[ ]]
Konstrukt nicht wirklich relevant .[ $value1 -eq $value2 ]
mit einem leerenvalue1
wäre'[' -eq 3 ']'
mit nein''
auf der linken Seite.Die Anführungszeichen brauchen Sie hier eigentlich nicht. Dies ist einer der wenigen Fälle, in denen es sicher ist, eine Variable ohne Anführungszeichen zu verwenden. Sie können dies bestätigen mit
set -x
:Wie Sie oben sehen können, werden die zitierten und nicht zitierten Versionen des Tests durch Bash genau gleich aufgelöst. Das Gleiche sollte für
zsh
jede andere Shell gelten, die den[[ ]]
Operator unterstützt .Beachten Sie, dass dies bei tragbaren Geräten nicht der Fall ist
[ ]
:Das
[ ]
Konstrukt[[ ]]
erfordert im Gegensatz zu dem einen ein Zitieren.Einige nützliche Links, um mehr darüber zu erfahren, wann und warum ein Angebot erforderlich ist:
quelle
declare -i var1=
ist0
bei der Auswertung.-eq
ein arithmetischer Vergleich ist, sodass Sie sogar das$
Auslassen (Einlassen[[ .. ]]
) und Schreiben ausführen können[[ a -eq b ]]
. Beim Stringvergleich brauchst du$
natürlich das[[ $a = $b ]]
var1="afoob"; var2="a*b"; [[ $var1 = $var2 ]] && echo match
. Wenn Sie die Glob-Zeichen verwenden möchten, ohne dass sie in einem Glob-Kontext (z. B. dem[[ ]]
) als Glob fungieren , müssen Sie sie in Anführungszeichen setzen, ja.((...))
oder berücksichtigt werden$((...)
. Es scheint zu funktionieren, aber ich mag es nicht.-eq
und Freunde im Inneren[[ ]]
sind auch arithmetische Kontexte. :) (Siehe auch: Automatische Variablenerweiterung innerhalb des Befehls bash [[]] )Auch wenn die Anführungszeichen nicht erforderlich sind, gibt es folgende Gründe, sie zu verwenden:
value1
undvalue2
sind variabel, und Sie wissen möglicherweise nicht, was sie enthalten. Andernfalls könnten Sie genauso gut fragen: "Warum sich mit Variablen beschäftigen anstatt sie zu überprüfenif [[ 5 -eq 3 ]]
? Oder noch weiter gehen, warum sich überhaupt um die kümmern,if
wenn Sie bereits wissen, dass 5 nicht gleich 3 ist? Es ist oft besser, defensiv zu sein. (Es ist wahr.) Diese[[
Wortspaltung kommt nicht vor , aber Fälle, in denen Wortspaltung nicht vorkommt , sind selten. Siehe auch den ersten Punkt.)quelle
Nicht direkt im Zusammenhang mit Ihrer Frage, aber ich benutze
Wenn ich Zahlen vergleiche, muss man aber auch keine Anführungszeichen verwenden.
quelle
if (( value1 == value2 )); then
. In arithmetischen Kontexten brauchen Sie nicht einmal die$
. Diese Frage scheint sich jedoch auf Variablen zu konzentrieren, die in[[ ... ]]
Tests verwendet werden.Du liegst absolut richtig!
Die Angabe in doppelten eckigen Klammern macht zumindest in diesem Fall überhaupt keinen Sinn.
Aber da ich täglich doppelte Anführungszeichen verwende - insbesondere für einfache eckige Klammern, die Übergabe von Argumenten an Funktionen und Skripten sowie manchmal die Zuweisung von Variablen (was für einfache Delkarationen völlig unbrauchbar ist) - denke ich, dass es zumindest einige Leute gibt, schreiben Sie instinktiv doppelte Anführungszeichen um variable Erweiterungen .
Wenn Sie konsequent und verständlich doppelte Anführungszeichen setzen, haben Sie den Vorteil, dass Kollegen, die noch keine Erfahrung mit Bash haben, lernen können, stabilere Skripte zu schreiben . Dies unterstreicht auch die Tatsache, dass es bei der Datenverarbeitung mit bash mehr darum geht , Datenströme (einschließlich Variablen) durch Feldtrennzeichen zu trennen und durch Filter zu leiten . 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 doppelten Anführungszeichen in einem Code-Hervorhebungs-Editor sein .
quelle