テストステートメントでの bash の文字列と数値の比較?

テストステートメントでの bash の文字列と数値の比較?

私が行っている比較についてはよく分かりません:

   if [ "$exit_status" -eq 0 ];then
   #some statements
   fi

これは数値を比較する正しい方法ですか、それとも引用符を使用して変数をexit_status0 と比較する文字列にするのですか。これが何らかのシナリオで失敗する可能性があるかどうかはわかりません。

答え1

はい、その通りです。

シェル内の引用符は他の言語とは異なる目的で使用されます。この答え詳細については。

シェルでは、引用符は、シェルが一部の文字を特別に扱うのを防ぎ、シェルが一部のタイプの展開(この場合の変数展開など)で実行する一部の操作を防ぐために使用されます。

通常、この場合、その変数の内容であるコマンドの"$exit_status"1 つの引数に展開される必要があるため、引用符が必要です。[

答え2

[ "$exit_status" -eq 0 ]$exit_status に数字のみが含まれている場合は正しいので、引用符を削除することもできます (IFS に数字が含まれていない限り)。

x が空または未設定の場合、[ "$x" -eq 6 ]エラーが発生しますが、次の処理は[[ "$x" -eq 6 ]]実行されません。

$ x=; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ unset x; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ x=; [[ "$x" -eq 6 ]]
$ unset x; [[ "$x" -eq 6 ]]
$ 

算術演算子は空白を削除します。

$ [ '6 ' -eq $'\n\t6' ]; echo $?
0

[[ 内の算術演算子のオペランドは算術式なので、例えば は[[ 4 -eq 2+2 ]]真です。0 で始まる数字は 8 進数として扱われます。

$ [[ 010 -eq 8 ]]; echo $?
0
$ [ 010 -eq 8 ]; echo $?
1

整数の比較でも = / == をよく使用します。= と == は、bash では [[ と [ の両方の中で同等です。== と [[ は POSIX では定義されていません。

[[ 内では単語の分割とパス名の展開は実行されません。y[[ $x = $y ]]をパターンとして扱いますが、[[ $x = "$y" ]]y は文字通りに扱われます。

$ x=44; y='4*'
$ [[ $x = $y ]]; echo $?
0
$ [[ $x = "$y" ]]; echo $?
1

答え3

ただし、数字を引用符で囲むことはあまり役に立ちません。パラメータ値が数字の場合、引用符は何も変更しません。そうでない場合は、if はいずれにしても失敗します。ただし、すべてのケースがそうであるとは限りません。

exit_status="a = a -o 0"; [ "$exit_status" -eq 0 ] # returns false
exit_status="a = a -o 0"; [ $exit_status -eq 0 ] # returns true

これは、bash の組み込みコマンドであるためです[が、それでも単純なコマンドであり、[[コマンド ラインの解析を変更する複合コマンドです。

関連情報