Ich habe ein Bash-Skript, das -e setzt, damit das Skript bei jedem Exit-Status beendet wird! = 0
Ich versuche, eine grundlegende Shell-Arithmetik auszuführen, die Variablen zugewiesen ist, und manchmal ist der Ausdruck gleich 0, wodurch der Exit-Status des Befehls let oder expr „1“ ist.
Hier ist ein Beispiel:
#!/bin/bash -ex echo "Test 1" Z=`expr 1 - 1` || true echo "Z will print" let "A=4 - 4" echo "A WILL NEVER PRINT $A" Y=`expr 1 - 1` echo "Y WILL NEVER PRINT $Y" X=$(expr 2 - 2) echo "X WILL NEVER PRINT $X"
Die Ausgabe lautet:
$ ./test_error.sh + echo "Test 1" Test 1 ++ expr 1 - 1 + Z=0 + true + echo "Z will print" Z will print + let "A=4 - 4"
My Die Frage ist, wie das idiomatische Bash-Scripting funktioniert, damit das Skript bei echten Exit-Fehlern fehlschlägt und nicht bei einer Grundrechenart von 0. Ich könnte all diese Ausdrücke mit folgenden Suffixen versehen:
A=`expr $C - $D` || true
Aber das scheint hackig.
Antwort
Verwenden Sie nicht expr
für die Arithmetik. Es ist seit langem veraltet: In Shells ist jetzt eine Arithmetik eingebaut, mit dem Konstrukt $((…))
(POSIX) oder mit dem eingebauten let
(ksh / bash / zsh) oder das Konstrukt ((…))
(ksh / bash / zsh).
let
und ((…))
gibt 1 (einen Fehlerstatuscode) zurück, wenn der zuletzt ausgewertete Ausdruck 0 ist. Um dies zu vermeiden, wird Ihr Skript unter set -e
beendet letzter Ausdruck, der keine 0 zurückgibt, zum Beispiel:
let "a = 2 - 2" 1 ((a = 2 - 2, 1))
Alternativ können Sie die || true
-Idiom:
((a = 2 - 2)) || true
Alternativ können Sie Ihre Arithmetik innerhalb von $((…))
und Ihre Aufgaben außerhalb ausführen. Eine Zuweisung gibt den Status der letzten Befehlssubstitution im Wert zurück oder 0, wenn keine Befehlssubstitution vorhanden ist, sodass Sie sicher sind. Dies hat den zusätzlichen Vorteil, dass Sie in jeder POSIX-Shell (z. B. Bindestrich) arbeiten können.
a=$((2 - 2))
Antwort
Ich hatte die gleiches Problem . tl; dr:
Wenn das letzte ARG [von let] 0 ergibt, gibt let 1 zurück, andernfalls let 0 .
Antwort
Verwenden Sie $(( $C - $D ))
stattdessen für Ihre Arithmetik. Es ist auch effizienter.
Kommentare
- Was macht es effizienter als
(( A = $C - $D ))
?
Antwort
Diese Syntax funktioniert für mich:
a=$((b + c))