2017-06-12 1 views
0

Ich versuche zu verstehen, warum eine nicht gesetzte Variable als 0 ausgewertet wird. in einigen Skripts im Schreiben wird die Variable nur bei Bedarf gesetzt und einige Zeit nicht . so wird diese Art von Verhalten mit falscher Ausgabe führen. bedeutet es, ich muss alle meine Variablen voreinstellen oder mindestens hinzufügen, dass sie gesetzt sind?Warum eine unset-Variable als 0 ausgewertet wird in bash if-Anweisung

#!/bin/bash 
#myvalue=0 #comment to simulate an unset variable. 

if [[ $myvalue -eq 0 ]] ; then 
    echo "OK" 
fi 

Ergebnis mit OK:

bash -x test.sh 
+ [[ '' -eq 0 ]] 
+ echo OK 
OK 
+0

versuche 'if [$ myvalue -eq 0]; dann ' –

+0

ich kann -eq mit [] nur [[]] benutzen und ich benutze es, weil ich eine Zahl auswerten muss. –

+1

Natürlich können Sie '-eq' mit' ['; tatsächlich ist es fraglich, ob Sie jemals '[[... -eq ...]]' 'verwenden sollten, da Sie stattdessen das viel besser lesbare' ((... == ...)) '' verwenden können. – chepner

Antwort

3

Der -eq Betreiber innerhalb [[ ... ]], da sie nur auf ganzzahlige Werte gilt, löst arithmetische Auswertung seiner Operanden. In einem arithmetischen Ausdruck, nicht definierter Variablen standardmäßig auf 0. Ein deutlicher Beweis für arithmetische Auswertung:

$ if [[ 3 -eq "1 + 2" ]]; then echo equal; fi 
equal 

Beachten Sie, dass in Ihrem Beispiel, brauchen Sie nicht einmal die Parameter zu erweitern zuerst; die arithmetische Auswertung wird es für Sie tun:

$ if [[ myvalue -eq 0 ]]; then echo equal; fi 
equal 
$ myvalue=3 
$ if [[ myvalue -eq 3 ]]; then echo equal; fi 
equal 

Auch dies dem bash[[ ... ]] Befehl spezifisch ist. Mit POSIX [ löst -eq keine arithmetische Auswertung aus.

$ if [ "$myvalue" -eq 0 ]; then echo equal; fi 
bash: [: : integer expression expected 
$ if [ myvalue -eq 0 ]; then echo equal; fi 
bash: [: myvalue: integer expression expected 
+0

Ich denke, das ist die Antwort, wie Sie geschrieben haben "In einem arithmetischen Ausdruck, setzen Sie die Standardwerte auf 0". Ich wusste das nicht. war auch auf der Suche nach solchen Informationen in Mann bash, aber fand es nicht. –

+0

Im ARITHMETIC EVALUATION-Abschnitt der Manpage gibt es einen Satz: "Eine Shellvariable, die null oder nicht gesetzt ist, wird auf 0 ausgewertet, wenn sie mit dem Namen referenziert wird, ohne den Parameter zu verwenden." Soweit ich weiß, ist die Tatsache, dass die numerischen Vergleichsoperatoren eine arithmetische Auswertung auslösen, jedoch nicht dokumentiert. – chepner

+0

(Ich denke, die Tatsache, dass '$ myvalue' und nicht nur' myvalue' als 0 behandelt wird, wenn Unset ist, ist ein unbeabsichtigter Nebeneffekt von '$ myvalue', der nicht gemäß den üblichen Regeln in' [[.. .]] '.). – chepner

0

Wenn Sie die wörtliche Wert wollen, dass der Vergleich = statt -eq bedienen.

if [[ $myvalue = 0 ]] ; then 
    echo "OK" 
fi 

Der arithmetische Binäroperators (-eq) liefert true, wenn arg1 zu 0 gleich ist, die $myvalue wird, ob auf 0 oder gar nicht gesetzt ... '' ist null, die gleich Null ist.

Verwandte Themen