A bash -e kilép, amikor a let vagy az expr 0 értékre áll

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

  • Mi teszi hatékonyabbá, mint mondani (( A = $C - $D ))?

Válasz

Ez a szintaxis nekem működik:

a=$((b + c)) 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük