GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie wertet Bash folgenden Code aus?

Diese Frage besteht aus zwei Teilen:

(a) Verstehen, was der ausgeschnittene Code tut

(b) Verständnis des Unterschieds zwischen Ausgangsstatus und Rückgabestatus im Kontext von bash .

Hier ist der Codeausschnitt, den ich zu verstehen versuche:

if var=-2 && (( var+=2 ))
then
    echo "True"
else
    echo "False"
fi

Wenn Sie dies ausführen, wird False erzeugt . Ich kann nicht verstehen, warum das passiert.

Wenn ich das richtig verstehe, ist hier, was vielleicht mit dem if passiert Bedingung:

(a) var=-2 erzeugt den Ausgangsstatus 0, da die Zuweisung erfolgreich war

(b) (( var+=2 )) addiert 2 zum Wert von var und der Ausdruck wertet Null aus. Der Exit-Status für diesen Begriff ist also 1

(c) 0 &&1 erzeugt einen Existenzstatus von 0, der dann von if verwendet wird konstruieren

Der if Konstrukt soll einfach den Exit-Status prüfen und wenn er Null ist, nimmt es das then Weg. In Schritt (c) oben ist es Null, aber das Skript nimmt immer noch das else Weg. Ist dies der richtige Weg, dies zu verstehen?

Außerdem sehe ich immer wieder verschiedene bash Texte verwenden den Ausgangsstatus und Rückgabestatus austauschbar.

Ich bezweifle var=-2 Zuweisung hätte einen beliebigen Exit-Status, da es sich nicht um ein Programm handelt. Aber jede Klärung des Unterschieds zwischen zwei wird großartig sein.

Akzeptierte Antwort:

Das ist:

if
  first list of commands
then
  second list of commands
else
  third list of commands
fi

Das heißt, die zweite Befehlsliste auszuführen, wenn die erste Befehlsliste mit einem true zurückkehrt /Erfolg (null) Exit-Status, das heißt, wenn der letzte Ausführungsbefehl darin mit einem Null-Exit-Status zurückkehrt.

In:

var=-2 && ((var += 2))

Es ist cmd1 && cmd2 wobei cmd2 wird nur ausgeführt, wenn cmd1 ist erfolgreich.

var=-2

Wird normalerweise erfolgreich sein, solange $var wurde nicht schreibgeschützt gemacht, also ((var += 2)) Befehl wird ausgeführt:

((arithmetic expression))

Gibt Erfolg zurück /wahr solange der Ausdruck korrekt ausgewertet wird (kein Syntaxfehler) und das Ergebnis des Ausdrucks ungleich Null ist.

  • ((123)) , ((1 + 1)) , ((1 == 1)) gib true zurück
  • ((0)) , ((-2 + 2)) , ((2 == -2)) gebe false zurück.
  • ((4294967296 * 4294967296)) gibt in den meisten Shells aufgrund des 64-Bit-Integer-Wrappings false zurück

var += 2 als arithmetischer Ausdruck, führt die Zuweisung durch und löst den zugewiesenen Wert auf, hier 0, also falsch Ausgangsstatus.

Sie können den Wert sehen, auf dem der Exit-Status basiert, indem Sie den $((...)) verwenden arithmetische Expansionssyntax:

$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0

Oder es einer Variablen zuweisen:

$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0

$? enthält den Exit-Status des vorherigen Befehls. Soweit if /then /else /fi 0 bedeutet wahr, alles andere bedeutet falsch.

Verwandte:Mac – Wie richten Sie das Macports-Paket Bash ein, das von terminal.app verwendet werden soll?

Die Verwirrung rührt hier daher, dass es bei arithmetischen Ausdrücken umgekehrt ist: bedeutet falsch und alles andere bedeutet wahr (zum Beispiel 2 == 2 ist 1 während 2 < 1 ist ).

Um sich keine Gedanken über den Unterschied zu machen, vergessen Sie einfach $? und seine möglichen Werte. Denken Sie einfach in Bezug auf das boolesche wahr /falsch , Erfolg /Fehler .

 grep -q foo file

Gibt wahr zurück, wenn foo befindet sich in file .

 [ "$a" = "$b" ]

Gibt wahr zurück, wenn $a enthält dasselbe wie $b .

 ((6 * 3 - 12))
 ((4 == 1))

Gibt wahr zurück, wenn das Ergebnis des arithmetischen Ausdrucks eine Zahl ungleich Null ist.

Es spielt keine Rolle, ob diese wahr sind /falsch werden in Form von 0 oder 1 des Exit-Status dieser grep ausgedrückt /[ Befehle oder ((...)) konstruieren.


Linux
  1. Bash-Befehlszeilen-Exit-Codes entmystifiziert

  2. Wie kann ich Exit-Codes für Anwendungen nachschlagen?

  3. Wie erhalte ich weitere Informationen über die Herkunft eines Ausgangscodes?

  4. Wie erkennt man Bash>=4.0?

  5. So werten Sie Zeichenfolgen als Zahlen in Bash aus

So kommentieren Sie in Bash

Bash Break:So verlassen Sie eine Schleife

So führen Sie ein Bash-Skript aus

Was sind Bash-Exit-Codes in Linux

So erhalten Sie den Exit-Status in einer Bash-Schleife

Bash:Schleife, bis der Befehlsausgangsstatus gleich 0 ist