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

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

どんな比較をしているのかよくわかりません。

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

変数がexit_statusゼロと比較して文字列になるように数値または引用符を比較する正しい方法ですか?場合によっては、これが失敗するかどうかわかりません。

答え1

はい、そうです。

シェルの引用符は、他の言語の引用符とは異なる目的に使用されます。バラよりこの回答詳細については。

シェルは引用符を使用して、シェルが特定の文字を特別に処理しないようにし、特定の種類の拡張(この場合は変数の拡張など)に対して特定の操作を実行しないようにします。

通常、この場合はコマンドの引数、つまりその変数の内容"$exit_status"に拡張しようとしているため、引用符が必要です。[

答え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

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

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

私は整数を比較するために= / ==をかなり頻繁に使用します。 = と == は bash の [[ と [ と同じです。 == と [[ は POSIX では定義されません。

[[内部では単語の区切りとパス名の拡張は行われません。[[ $x = $y ]]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は組み込みですが、まだ単純なコマンドですが、[[コマンドラインの解析を変更する複合コマンドだからです。

関連情報