この質問には2つの部分があります。
(a) 切り捨てられたコードが何をするかを理解する。
(b) 両者の違いを理解する終了ステータスそして返品ステータスin... 壁紙bash
.
私が理解しようとしているコードスニペットは次のとおりです。
if var=-2 && (( var+=2 ))
then
echo "True"
else
echo "False"
fi
これを実行すると、False
なぜこれが起こるのか理解できません。
私が正しく理解した場合、これが起こる可能性がありますif
。
(a)var=-2
割り振りが成功したため終了ステータス 0 を生成します。
(b)(( var+=2 ))
の値に2を加えると、var
式は0と評価されます。したがって、この学期の終了ステータスは1です。
if
(c) 0 && 1 は 0 というプレゼンス状態を生成し、コンストラクタによって使用されます。
コンストラクタはif
単に終了ステータスを確認する必要があり、終了ステータスが0の場合は次のことを行います。それから道。上記の(c)ステップでは0ですが、スクリプトはまだその他道。これがこれを理解する正しい方法ですか?
bash
また、以下を使用してさまざまなテキストを表示し続けます。終了ステータスそして返品ステータス交換可能です。
var=-2
プログラムではないため、課題がどのような終了状態を持つのか疑われます。しかし、2つの違いの説明があれば良いでしょう。
ベストアンサー1
それは:
if
first list of commands
then
second list of commands
else
third list of commands
fi
最初のコマンドリストが返されると、2番目のコマンドリストが実行されます。本物/成功(0) 終了ステータス、つまり最後のコマンド実行が終了ステータス 0 を返しました。
存在する:
var=-2 && ((var += 2))
成功しなければ走らないところですcmd1 && cmd2
。cmd2
cmd1
var=-2
$var
読み取り専用に設定されていない限り、通常は成功するため、次の((var += 2))
コマンドが実行されます。
((arithmetic expression))
商品を返す成功/本物式が正しく評価され(構文エラーなし)、式の結果がゼロでない限り。
((123))
、、真を((1 + 1))
返す((1 == 1))
((0))
、、falseを返します((-2 + 2))
。((2 == -2))
((4294967296 * 4294967296))
64ビット整数のラップのため、ほとんどのシェルでfalseを返します。
var += 2
算術式で割り当てが実行され、割り当てられた値(ここでは0)として解釈されます。間違った終了ステータス。
算術拡張構文を使用して、終了状態に応じた値を表示できます$((...))
。
$ 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
///つまり、0はtrueを表しthen
、その他の値はfalseを表しますelse
。fi
ここでの混乱は、算術式の場合はその逆であるという事実に由来します。つまり、0
偽を意味し、他のものは真を意味します(例:2 == 2
is 1
while 2 < 1
is 0
)。
違いを心配しない場合は、$?
可能な値を忘れてください。ブール値の観点から考えてみてください。本物/間違った、成功/失敗する。
grep -q foo file
foo
で見つかった場合はtrueを返しますfile
。
[ "$a" = "$b" ]
$a
と同じ内容が含まれている場合はtrueを返します$b
。
((6 * 3 - 12))
((4 == 1))
算術式の結果がゼロ以外の数値の場合はtrueを返します。
そのようなものは関係ありません。本物/間違ったgrep
これらの/[
コマンドまたは構文の終了ステータス0または1として表示されます((...))
。