2016-12-16 22 views
0

私はbashで簡単な計算をしていますが、計算結果がゼロの場合はexprを使用したbash計算がです。結果が0の場合、bash計算では1が返されるのはなぜですか?

[email protected]:~$ expr 42 - 40 ; echo $? 
2 
0 

[email protected]:~$ expr 42 - 84 ; echo $? 
-42 
0 

[email protected]:~$ expr 42 - 42 ; echo $? 
0 
1 

なぜbashがこれを行うのですか?戻り値は、プログラムが失敗したことを示していますか?この行動は良い習慣に違反しないのですか?

set -eで実行されるスクリプト内でいくつかの計算を行っています。 1の戻り値を考慮する最も良い方法は何ですか? 私は

expr $var1 - $var2 || true 

を行うことができますが、これはまた以外の終了コードを無視します。

+5

'男expr'であるかどうかをチェックすることで、真偽をブールとは対照的に、あなたはまだ、実際のエラーを検出することができます

n=10 while expr "$n" - 3; do ... done 

注:_Exitステータスが0でありますEXPRESSIONがヌルでも0でもない場合は、EXPRESSIONがNULLまたは0の場合は1、構文的に無効な場合は2、エラーが発生した場合は3です。また、算術演算には 'expr'を使用しないでください。 –

+2

httpも参照してください。 ://unix.stackexchange.com/questions/63166/bash-e-exits-when-let-or-expr-evaluates-to-0 – Roland

+1

私はこの質問を議論の対象外としています。まずmanページを読んでください。 –

答えて

1

これは、シェル終了コード(0 =成功、> 0 =失敗)に対する整数(ブール値、0 = False、1 = True)のマッピングに過ぎません。 「失敗」は、必ずしも「プログラムにエラーが発生した、および/またはクラッシュした」という意味ではないことに注意してください。他のプログラムは同様のことを行う:Cで

* `grep` exits with 0 if a match is made, 1 if no match is made. 
* `test` exits 0 if its condition is true, 1 if its condition is false. 

は、あなたがifまたはwhile文の条件として直接算術式の結果を使用することができます。

シェルでは、このようなステートメントはコマンドの終了コードをテストし、成功をtrueと類似とみなし、falseをfalseと同様に扱います。この意味でexpr ...test ... -ne 0の略です。典型的な言語で

は、あなたが

# Python 
n = 10 
while n - 3: # short for n > 3 
    ... 

よう

expr何かを書く算術演算を実行し、その終了ステータスが同じことを許可することは理にかなっています。 exprの終了ステータスが1より大きい

n=10 
while true; do # "Infinite" loop 
    expr "$n" - 3 
    case $? of 
     1) break ;; 
     2) echo "Error with expr" >&2; break ;; 
    esac 

    ... 
done 
関連する問題