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