2016-12-09 2 views
0

Das funktioniert nicht, und jedes Mal führt die else-Klausel:bash if-Anweisung, Toggle

state=false 
function toggle { 
    if [ ! $state ] 
    then 
    echo first 
    state=true 
    else 
    echo second 
    state=false 
    fi 
} 

Ich würde erwarten, dass toggle mehrere Male anrufen würde zwischen „ersten“ und „zweiten“ abwechselnd Ausgang, aber stattdessen bekomme ich nur "zweite"

Antwort

3

test verwendet nicht die Strings true und false für boolesche Werte. test behandelt jede nicht leere Zeichenfolge als wahr und eine leere Zeichenfolge als falsch.

Sie müssen explizite Vergleiche durchführen:

state=false 
function toggle { 
    if [ "$state" = false ] 
    then 
    echo first 
    state=true 
    else 
    echo second 
    state=false 
    fi 
} 
1

Sowohl true und false sind, in Ihrem Fall, nur Zeichenfolgen, die auf die logische wahr zu bewerten.

Also unabhängig, ob Zustand enthält das Wort true oder false, [ ! $state ] wird immer auf die logische false zurückkehren - Ihre else Klausel auslösen.

Da Sie bereits true und false verwenden, gibt es etwas, was Sie tun können: Sowohl true und false gelten Shell-Befehle, die nichts tun, aber einen Fehlercode von 0 bzw. 1 zurück. Da if grundsätzlich einen Befehl auswertet (schauen Sie, [ eine ausführbare Datei ist) und nutzt dessen Fehlercode, könnten Sie so etwas tun:

if $state; 

$state würde entweder false oder true, die dann ausgeführt werden, würden durch if, und wählen Sie je nach Fehlercode aus, welcher spezifische Codeblock des Blocks if ... else ... fi ausgeführt werden soll.

+0

'-eq' ist für Zahlen,' = 'ist für Strings. – Barmar

+0

Sie haben recht, ich habe etwas ganz anderes gemacht;) – chw21

+0

Während dies funktioniert, schlage ich vor, dass Sie klarstellen, dass dieses _only_ wie vorgesehen mit '$ state' Werten von' false' und 'true' arbeitet und dass der Ansatz beruht auf der Ausführung des Variablenwerts - was auch immer es ist - _als ein Befehl_. – mklement0

0

Ich weiß nicht wohin es ging, aber meine Lieblingsantwort scheint verschwunden zu sein.

state= 
function toggle { 
    if [ ! $state ] 
    then 
    echo first 
    state=true 
    else 
    echo second 
    state= 
    fi 
}