Ho uno script bash che imposta -e così lo script uscirà in qualsiasi stato di uscita! = 0 .
Sto cercando di eseguire alcuni aritmetici di shell di base assegnati alle variabili e talvolta lespressione è uguale a 0, il che fa sì che lo stato di uscita del comando let o expr sia “1”.
Ecco un esempio:
#!/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"
Loutput è:
$ ./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"
Il mio la domanda è qual è il modo idiomatico di scripting bash per consentire allo script di fallire su errori di uscita reali e non su aritmetica di base uguale a 0. Potrei aggiungere a tutte queste espressioni il suffisso:
A=`expr $C - $D` || true
Ma sembra un trucco.
Risposta
Non utilizzare expr
per aritmetica. È stato a lungo obsoleto: le shell ora hanno aritmetica incorporata, con il $((…))
costrutto (POSIX) o con let
incorporato (ksh / bash / zsh) o il costrutto ((…))
(ksh / bash / zsh).
let
e ((…))
restituisce 1 (un codice di stato di errore) se lultima espressione valutata è 0. Per evitare che ciò causi la chiusura dello script in set -e
, predisporre il ultima espressione per non restituire 0, ad esempio:
let "a = 2 - 2" 1 ((a = 2 - 2, 1))
In alternativa, utilizza || true
idioma:
((a = 2 - 2)) || true
In alternativa, esegui i calcoli aritmetici allinterno di $((…))
e i compiti allesterno. Unassegnazione restituisce lo stato dellultima sostituzione del comando nel valore, o 0 se non cè sostituzione del comando, quindi sei al sicuro. Questo ha il vantaggio aggiuntivo di lavorare in qualsiasi shell POSIX (come il trattino).
a=$((2 - 2))
Risposta
Avevo stesso problema . tl; dr:
Se lultimo ARG [di let] restituisce 0, let restituisce 1; let restituisce 0 altrimenti .
Risposta
Usa $(( $C - $D ))
invece per il tuo aritmatico. È anche più efficiente.
Commenti
Risposta
Questa sintassi per me funziona:
a=$((b + c))
(( A = $C - $D ))
?