Van egy bash szkriptem, amely beállítja az -e parancsot, így a parancsfájl minden kilépési állapotnál kilép! = 0 .
Megpróbálok néhány változóhoz rendelt shell-aritmetikát elvégezni, és néha a kifejezés 0-val egyenlő, ami a let vagy expr parancs kilépési állapotát “1” -re váltja ki.
Itt van egy példa:
#!/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"
A kimenet:
$ ./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"
Saját a kérdés az, hogy mi az az idiomatikus bash szkriptelési módszer, amely lehetővé teszi a szkript meghibásodását valós kilépési hibák esetén, és nem az alap számtani egyenlőség esetén. Mindazokat a kifejezéseket kiegészíthetem a következővel:
A=`expr $C - $D` || true
De ez hackernek tűnik.
Válasz
Ne használja expr
aritmetikához. Régóta elavult: a héjakba már beépítették a számtant, a $((…))
konstruktummal (POSIX) vagy a let
beépítettel (ksh / bash / zsh) vagy a ((…))
konstrukció (ksh / bash / zsh).
let
és ((…))
return 1 (meghibásodási kód), ha az utoljára kiértékelt kifejezés értéke 0. Ennek elkerülése érdekében a szkript kilép a set -e
alatt, gondoskodjon a az utolsó kifejezés nem ad vissza 0-t, például:
let "a = 2 - 2" 1 ((a = 2 - 2, 1))
Alternatív megoldásként használja a || true
idiómát:
((a = 2 - 2)) || true
Alternatív megoldásként végezze el aritmetikáját a $((…))
belül, és a hozzárendeléseket kívül. A hozzárendelés visszaadja az érték utolsó parancshelyettesítésének állapotát, vagy 0, ha nincs parancshelyettesítés, így biztonságban lehet. Ennek további előnye, hogy bármely POSIX héjban (például kötőjelben) dolgozhat.
a=$((2 - 2))
Válasz
Nekem volt ugyanaz a probléma . tl; dr:
Ha az utolsó [let] ARG értéke 0, hagyjon 1-et, ellenkező esetben hagyjon 0-t .
Válasz
Használja a $(( $C - $D ))
helyett az aritmatikus. Ez is hatékonyabb.
Megjegyzések
Válasz
Ez a szintaxis nekem működik:
a=$((b + c))
(( A = $C - $D ))
?