bash -e wird beendet, wenn let oder expr 0 ergibt.

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)) 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.