この質問には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で表されます。 / [
コマンドまたは((...))
構築します。