web-dev-qa-db-ja.com

[[]]テストで二重引用符を使用する理由

Bashスクリプトに2つの整数があるとします。

value1=5
value2=3

では、テストの場合になぜ二重引用符を使用する必要があるのでしょうか。例えば:

if [[ "$value1" -eq "$value2" ]]

以下を使用しないのはなぜですか?

if [[ $value1 -eq $value2 ]]

私にとって、二重引用符は意味がありません。

23
Meerkat

単語分割。

この例はありそうもないただし可能なので、防御的にコーディングする場合は、トラックを引用符で囲みます。

$ set -x
$ value1=5
+ value1=5
$ value2=3
+ value2=3
$ [ $value1 -eq $value2 ]
+ '[' 5 -eq 3 ']'

OK、これまでのところすべて良好です。レンチをギアに入れましょう:

$ IFS=456
+ IFS=456
$ [ $value1 -eq $value2 ]
+ '[' '' -eq 3 ']'
bash: [: : integer expression expected

おっとっと。

$ [ "$value1" -eq "$value2" ]
+ '[' 5 -eq 3 ']'

ああ。

7
glenn jackman

ここで実際に引用符は必要ありません。これは、引用符で囲まれていない変数を使用しても安全な非常にまれなケースの1つです。これはset -xで確認できます:

$ var1=""
$ var2="3"
$ set -x
$ if [[ $var1 -eq $var2 ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!
$ if [[ "$var1" -eq "$var2" ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!

上記のように、引用符付きと引用符なしのテストのバージョンは、bashによってまったく同じものに解決されます。 zshと、[[ ]]演算子をサポートする他のシェルについても同様です。

これは、より移植性の高い[ ]の場合ではないことに注意してください。

$ if [ $var1 -eq $var2 ]; then echo "match!"; else echo "no match!"; fi
+ '[' -eq 3 ']'
sh: [: -eq: unary operator expected
+ echo 'no match!'
no match!

[ ]構成は、[[ ]]構成とは異なり、引用符で囲む必要があります。


引用が必要となる時期と理由について詳しく知るための便利なリンク:

35
terdon

二重引用符は必要ありませんが、使用する理由は次のとおりです。

  • 良い習慣/習慣:thisの場合は必要ありませんが、一般的には二重引用符areを使用して、意図しないWordの分割を回避します。
  • value1value2は可変であり、それらの内容がわからない場合があるためです。それ以外の場合は、「if [[ 5 -eq 3 ]]をチェックするのではなく、なぜ変数に悩まされるのか、あるいは、5が3に等しくないことをすでに知っているのに、なぜifに悩まされるのか」 ?防御的である方が良い場合がよくあります(Word-splittingが[[で発生しないことは事実ですが、Word-splittingがnotが発生するケースはまれです。ここでも、最初のポイント。)
16
jamesdlin

あなたは、絶対に正しい!

二重角括弧内の引用は、少なくともこの場合はまったく意味がありません。

しかし、私は毎日二重引用符を使用しているため、特に単一の角かっこ式、関数やスクリプトへの引数の引き渡し、および変数の割り当てが時々行われます(単純なデリカレーションではまったく役に立たない場合があります)一部の人は、少なくとも、本能的に変数展開を二重引用符で囲みます

二重引用符を使用すると、節約感を得ることができます。それは二重引用符がある家に帰るようなものです。 -D.クンマー

二重引用符を結果的かつ包括的に行うことの利点-しかし、それが理にかなっている場合のみ-bashを初めて使用する同僚が学習できることより安定したスクリプトの書き方。また、bashを使用したデータ処理の芸術は、フィールドセパレーターとパイプによるデータストリーム(変数を含む)の分離変数を含む)に関するものであるという事実を強調します。それらをフィルターで。データチャンクをストリームから分離したらすぐに、二重引用符でそれらをまとめてください!

もう1つの利点は、二重引用符で囲まれた文字列を含むbashスクリプトが読みやすくなることですコードハイライトエディター内

1
Dominik Kummer

あなたの質問とは直接関係ありませんが、私は

if(($ value1 == $ value2));その後

数値を比較するときも、引用符を使用する必要はありません。

1
framp