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

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

私の問題は、0に等しい基本的な算術ではなく、実際の終了エラーでスクリプトが失敗することを可能にする、慣用的なbashスクリプトの方法です。これらすべての式に次の接尾辞を付けることができます。 div>

しかしそれはハッキーのようです。

回答

exprは算術用です。これは長い間廃止されてきました。シェルには、$((…))コンストラクト(POSIX)またはlet組み込み(ksh /)を使用した算術演算が組み込まれています。 bash / zsh)または((…))コンストラクト(ksh / bash / zsh)。

letおよび((…))最後に評価された式が0の場合、1(失敗ステータスコード)を返します。これによりスクリプトがset -eで終了するのを防ぐには、たとえば、0を返さない最後の式:

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

または、|| trueイディオムを使用します:

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

または、$((…))の内部で演算を実行し、外部で割り当てを実行します。割り当ては、値の最後のコマンド置換のステータスを返します。コマンド置換がない場合は0を返すため、安全です。これには、POSIXシェル(ダッシュなど)で機能するという追加の利点があります。

a=$((2 - 2)) 

回答

同じ問題。tl; dr:

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

回答

$(( $C - $D ))を算術演算に使用します。これも効率的です。

コメント

回答

この構文は私に適しています:

a=$((b + c)) 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です