bash -e esce quando let o expr restituisce 0

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

  • Cosa lo rende più efficiente di dire (( A = $C - $D ))?

Risposta

Questa sintassi per me funziona:

a=$((b + c)) 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *