bash -e は let または expr が 0 と評価されると終了します。

bash -e は let または expr が 0 と評価されると終了します。

-e を設定する bash スクリプトがあるため、スクリプトは終了ステータス!=0 で終了します。

変数に割り当てるいくつかの基本的なシェル算術演算を実行しようとすると、時には式が0に等しく、その結果、letまたはexprコマンドで終了状態が「1」になります。

例は次のとおりです。

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

出力は次のとおりです

$ ./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'

私の質問は、ゼロのような基本的な算術で失敗するのではなく、スクリプトが実際のシャットダウンエラーで失敗することを可能にするbashスクリプトを書く慣用的な方法です。次のすべての表現に接尾辞を付けることができます。

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

しかし、これは奇妙なようです。

答え1

操作には使用しないでくださいexpr。もはや使われていません。シェルには、構文$((…))(POSIX)またはlet組み込み(ksh / bash / zsh)または構文((…))(ksh / bash / zsh)を含む算術組み込み機能があります。

let最後に評価された式が0の場合、((…))1(失敗ステータスコード)が返されます。以下でスクリプトが終了しないようにするには、最後の式がゼロを返さないようにset -e準備してください。例:

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

または、次の|| trueイディオムを使用してください。

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

または内部的に算術演算を実行し、$((…))外部で割り当てを実行します。割り当ては、値に最後のコマンド置換状態を返します。コマンド置換がなければゼロが返され、これは安全です。これには、すべてのPOSIXシェル(たとえばdash)で作業できるという利点もあります。

a=$((2 - 2))

答え2

私は持っています同じ問題。簡単に言うと:

[let]の最後のARGが0と評価された場合、letは1を返し、そうでない場合は0を返します。

答え3

この構文は私にとって効果的です。

a=$((b + c))

答え4

$(( C - D ))算術を変更してください。また、より効率的です。

関連情報