bash -e iese când let sau expr evaluează la 0

Am un script bash care setează -e, astfel scriptul va ieși pe orice stare de ieșire! = 0 .

Încerc să fac o aritmetică de bază a shell-ului atribuită variabilelor și uneori expresia este egală cu 0, ceea ce face ca starea de ieșire a comenzii let sau expr să fie „1”.

Iată un exemplu:

#!/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" 

Rezultatul este:

$ ./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 întrebarea este care este modalitatea idiomatică de scripting bash pentru a permite scriptului să nu reușească la erori de ieșire reale și nu la aritmetica de bază egală cu 0. Aș putea completa toate aceste expresii cu:

A=`expr $C - $D` || true 

Dar asta pare ciudat.

Răspuns

Nu folosiți expr pentru aritmetică. A fost demult depășit: shell-urile au acum aritmetică încorporată, cu construcția $((…)) (POSIX) sau cu let încorporat (ksh / bash / zsh) sau construcția ((…)) (ksh / bash / zsh).

let și ((…)) returnează 1 (un cod de stare de eșec) dacă ultima expresie evaluată este 0. Pentru a evita acest lucru, scriptul dvs. iese din set -e, aranjați pentru ultima expresie să nu returneze 0, de exemplu:

let "a = 2 - 2" 1 ((a = 2 - 2, 1)) 

Alternativ, utilizați expresia || true:

((a = 2 - 2)) || true 

Alternativ, efectuați aritmetica în interiorul $((…)) și sarcinile dvs. în afara. O atribuire returnează starea ultimei înlocuiri de comandă din valoare sau 0 dacă nu există nicio înlocuire de comandă, deci sunteți în siguranță. Aceasta are avantajul suplimentar de a lucra în orice shell POSIX (cum ar fi liniuță).

a=$((2 - 2)) 

Răspuns

Am avut aceeași problemă . tl; dr:

Dacă ultimul ARG [din let] se evaluează la 0, let returnează 1; let returnează 0 altfel .

Răspuns

Utilizați $(( $C - $D )) în locul aritmaticului dvs. „Este și mai eficient.

Comentarii

  • Ceea ce îl face mai eficient decât să spuneți (( A = $C - $D ))?

Răspuns

Această sintaxă funcționează pentru mine:

a=$((b + c)) 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *