この質問には2つの部分があります:
(a)切り取られたコードが何をしているのかを理解する
(b)終了ステータスの違いを理解する およびステータスを返す bashのコンテキストで 。
これが私が理解しようとしている切り取られたコードです:
if var=-2 && (( var+=2 ))
then
echo "True"
else
echo "False"
fi
これを実行すると、 Falseが生成されます 。なぜこれが起こっているのか理解できません。
私がこれを正しく理解していれば、ここで ifで起こっている可能性があります 状態:
(a) var =-2 割り当てが成功したため、終了ステータス0が作成されます
(b)((var + =2)) varの値に2を追加します 式はゼロと評価されます。したがって、この用語の終了ステータスは1です
(c)0 &&1は、存在ステータス0を作成し、 ifによって使用されます。 コンストラクト
if コンストラクトは単に終了ステータスをチェックすることになっており、ゼロの場合は thenを取ります 道。上記のステップ(c)ではゼロですが、スクリプトは引き続き elseを取ります 道。これを理解する正しい方法ですか?
また、さまざまな bashを見続けています テキストは終了ステータスを使用します およびステータスを返す 交換可能。
var =-2は疑わしい 割り当てはプログラムではないため、任意の種類の終了ステータスになります。しかし、2つの違いを明確にすることは素晴らしいことです。
承認された回答:
それは:
if
first list of commands
then
second list of commands
else
third list of commands
fi
これは、コマンドの最初のリストが true で返された場合に、コマンドの2番目のリストを実行することです。 /成功 (ゼロ)終了ステータス、つまり、最後に実行されたコマンドがゼロの終了ステータスで戻った場合。
で:
var=-2 && ((var += 2))
cmd1 &&cmd2 ここで、 cmd2 cmd1の場合にのみ実行されます 成功しました。
var=-2
$ var である限り、通常は成功します 読み取り専用になっていないため、((var + =2)) コマンドが実行されます:
((arithmetic expression))
成功を返します / true 式が正しく評価され(構文エラーがない)、式の結果がゼロ以外である限り。
-
((123))、((1 + 1))コード> 、((1 ==1))trueを返す -
((0))、((-2 + 2))コード> 、((2 ==-2))falseを返します。 -
((4294967296 * 4294967296))64ビット整数ラッピングのため、ほとんどのシェルでfalseを返します
var + =2 算術式として、割り当てを実行し、割り当てられている値(ここでは0)に解決されます。したがって、 false 終了ステータス。
$((...))を使用すると、終了ステータスに基づく値を確認できます。 算術展開構文:
$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0
または、変数に割り当てます:
$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0
$? 前のコマンドの終了ステータスが含まれます。 ifまで /次に / else / fi 懸念される場合、0は真を意味し、それ以外は偽を意味します。
ここでの混乱は、算術式の場合、その逆であるという事実に起因します: falseを意味し、それ以外はtrueを意味します(たとえば、 2 ==2 1です 2 <1 です 。
違いを気にしないように、 $?を忘れてください。 とその可能な値。ブール値のtrueの観点から考えてください / false 、成功 /失敗 。
grep -q foo file
fooの場合はtrueを返します fileにあります 。
[ "$a" = "$b" ]
$ aの場合はtrueを返します $ bと同じものが含まれています 。
((6 * 3 - 12))
((4 == 1))
算術式の結果がゼロ以外の数値の場合はtrueを返します。
それらが本当であるかどうかは関係ありません / false これらのgrepの終了ステータスの0または1で表されます。 / [ コマンドまたは((...)) 構築します。