117 Stimmen

Wie kann man eine boolesche Variable in einem if-Block in Bash auswerten?

Ich habe die folgende Variable definiert:

myVar=true

Ich würde jetzt gerne etwas in dieser Richtung machen:

if [ myVar ]
then
    echo "true"
else
    echo "false"
fi

Der obige Code funktioniert zwar, aber wenn ich versuche, die

myVar=false

wird weiterhin wahr ausgegeben. Wo könnte das Problem liegen?

edit: Ich weiß, dass ich etwas in der Form machen kann

if [ "$myVar" = "true" ]; then ...

aber es ist ein bisschen unangenehm.

Gracias

183voto

Aaron Digulla Punkte 308693

Die Bash kennt weder boolesche Variablen, noch kennt sie test (was aufgerufen wird, wenn Sie [ ).

Das wäre eine Lösung:

if $myVar ; then ... ; fi

denn true y false sind Befehle, die Folgendes zurückgeben 0 o 1 bzw. was das ist if erwartet.

Beachten Sie, dass die Werte "vertauscht" sind. Der Befehl nach if muss zurückkehren 0 auf Erfolg, während 0 bedeutet in den meisten Programmiersprachen "falsch".

SICHERHEITSWARNUNG : Das funktioniert, weil BASH die Variable expandiert und dann versucht, das Ergebnis als Befehl auszuführen! Vergewissern Sie sich, dass die Variable keinen bösartigen Code enthalten kann wie rm -rf /

70voto

Jens Punkte 65511

Beachten Sie, dass die if $myVar; then ... ;fi construct hat ein Sicherheitsproblem, das Sie vielleicht vermeiden möchten mit

case $myvar in
  (true)    echo "is true";;
  (false)   echo "is false";;
  (rm -rf*) echo "I just dodged a bullet";;
esac

Sie sollten vielleicht auch überdenken, warum if [ "$myvar" = "true" ] für Sie unangenehm erscheint. Es handelt sich um einen Shell-String-Vergleich, der das Forking eines Prozesses übertrifft, nur um einen Exit-Status zu erhalten. Ein Fork ist eine schwere und teure Operation, während ein String-Vergleich sehr billig ist. Denken Sie an ein paar CPU-Zyklen gegenüber mehreren Tausend. Mein case Lösung wird auch ohne Gabeln gehandhabt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X