使用[[

使用[[

クサラナンダとシエンヌの議論を見ています。ここ、これは有効なテストではなく、[ "" -ge 2 ]他のPOSIX互換シェルでエラーを生成することに言及しています。bash --posix

bash-4.3$ [ "" -gt 10 ]
bash: [: : integer expression expected
bash-4.3$ [ '' -gt 10 ]
bash: [: : integer expression expected

そこにすべてが大丈夫です。好奇心に私も同じことを試してみました[[

bash-4.3$ [[ "" -gt 10 ]] && echo "YES"
bash-4.3$ [[ "" -gt 0 ]] && echo "YES"
bash-4.3$ [[ "" -gt -1 ]] && echo "YES"
YES
bash-4.3$ [[ "" -eq 0 ]] && echo "YES"
YES

ご覧のとおり、エラーはなく、実際には ""がゼロの数値式として評価されます。それでは、ここで正確に何が起こっているのでしょうか?[[以前またはPOSIXと一致しませんかtest?数値比較の代わりに文字列比較のみ実行しますか?

ベストアンサー1

[との1つの違いは次のとおりです[[[いいえ算術評価を実行しますが[[

$ [ "2 + 2" -eq 4 ] && echo yes
bash: [: 2 + 2: integer expression expected
$ [[ "2 + 2" -eq 4 ]] && echo yes
yes

2番目の微妙さはどこでも算術評価Bashで実行すると、空の文字列は0と評価されます。たとえば、

$ x=""; echo $((0 + x))
0
$ [[ "" -eq 0 ]] && echo yes
yes

文書

からman bash

シェル変数はオペランドとして受け入れられます。式が評価される前に、パラメータ拡張が実行されます。式内では、シェル変数はパラメーター拡張構文を使用せずに名前で参照することもできます。 nullまたは設定されていないシェル変数は、パラメータ拡張構文を使用せずに名前で参照すると0に評価されます。変数が参照される場合、または-i宣言を使用して整数属性が割り当てられた変数に値が割り当てられると、変数の値は算術式として評価されます。 NULL 値は 0 と評価されます。。シェル変数は、整数プロパティを設定しなくても式で使用できます。 [強調追加]

ナレーター:セキュリティの問題

Bashの算術評価は潜在的なセキュリティ問題です。たとえば、次のことを考えてみましょう。

x='a[$(rm -i *)]'
[[ x -eq 0 ]] && echo yes

上記の作業は、この-iオプションを使用すると安全ですが、一般的なレッスンは、整理されていないデータに対してbashの算術評価を使用しないことです。

対照的に、 を使用すると[算術評価は行われないため、コマンドはファイルの削除を試みません。代わりに、安全にエラーが発生します。

$ x='a[$(rm -i *)]'
$ [ "$x" -eq 0 ] && echo yes
bash: [: a[$(rm -i *)]: integer expression expected

この問題の詳細については、次を参照してください。この回答

おすすめ記事