GNU/Linux >> Linux の 問題 >  >> Linux

Bashは次のコードをどのように評価しますか?

この質問には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は真を意味し、それ以外は偽を意味します。

関連:Mac – terminal.appから使用するmacportsパッケージbashをどのように設定しますか?

ここでの混乱は、算術式の場合、その逆であるという事実に起因します: 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で表されます。 / [ コマンドまたは((...)) 構築します。


Linux
  1. Bashスクリプトをデバッグする方法は?

  2. 終了コードの出所に関する詳細情報を取得するにはどうすればよいですか?

  3. Bashで文字列を数値として評価する方法

  1. Ubuntu18.04にRをインストールする方法

  2. 実際の例を含む Bash シェルの終了ステータスのチュートリアル

  3. コマンドが失敗した場合の終了方法

  1. アプリケーションの終了コードを検索する方法は?

  2. バッシュを検出する方法>=4.0?

  3. bashでループの終了ステータスを取得する方法