Unix.stackexchange.comをしばらくフォローしている場合は、Bourne/POSIXシェル(z [sshは例外])のリストコンテキスト(echo $var
のように)で変数を引用符で囲まないでおくと、非常に特別な意味があり、非常に正当な理由がない限り実行すべきではありません。
ここでは多くのQ&Aで詳しく説明されています(例: 空白文字やその他の特殊文字でシェルスクリプトが詰まるのはなぜですか? 、 二重引用符が必要な場合 、- Shell変数の展開とglobの影響とそれに分割 、 引用vs引用符なしの文字列展開 )
70年代後半のBourne Shellの最初のリリースからそうであり、Korn Shell( David Kornの最大の後悔(質問#7) )またはbash
によって変更されていません。ほとんどがKornシェルをコピーし、それがPOSIX/Unixで指定されている方法です。
今でも、多くの回答がここにあり、変数が引用されていないシェルコードが公開されていることもあります。あなたは人々が今までに学んだと思っていたでしょう。
私の経験では、変数の引用を省略している人は主に3種類あります。
初心者。確かにそれは完全に直感的ではない構文であるため、それらは言い訳することができます。そして、彼らを教育することがこのサイトでの私たちの役割です。
忘れっぽい人。
確かにボーンシェルの作者はすべての変数を引用するつもりはなかったと思うハンマーを繰り返した後でも納得しない人.
この種の行動に関連するリスクを明らかにすれば、おそらく彼らを説得できるでしょう。
変数の引用を忘れた場合に起こり得る最悪の事態は何ですか。本当にそれ悪いのですか?
ここでは、どのような脆弱性について話しているのですか?
どのような状況で問題になるのでしょうか?
私はステファンの答えに懐疑的でしたが、悪用することは可能です$#
:
$ set `seq 101`
$ IFS=0
$ echo $#
1 1
または$ ?:
$ IFS=0
$ awk 'BEGIN {exit 101}'
$ echo $?
1 1
これらは人為的な例ですが、可能性は存在します。