"_"
以下に示すように、if 比較で使用するシェル スクリプトを何度も目にします。
if [ "_$str" = "_" ]; then ....; fi
上記のコードは、比較で str 変数が空かどうかをチェックしますif [ "_$str" = "_" ]
。
なぜ使用しないのif [ "$str" = "" ]
ですか?"_"
なぜ両方の文字列を追加するのですか?
私の知る限り、それは歴史的な理由によるものです。空の文字列 (およびおそらくダッシュで始まる文字列) の処理に問題があった (ある) シェルがありました (そして、一部のあいまいなシステムではまだ残っている可能性があります)。したがって、プレフィックスを追加することで、空の文字列 (およびオプションのように見える文字列) を完全に防ぐという単純なアイデアです。今日のすべての一般的なシェルには、これらの問題はありません。
引用符を適切に使用する方法を学ぶ前に、あなたが見たスクリプトの作成者は次のような問題を抱えていたと推測できます
if [[ $str = "" ]]; then ....
$str が空の場合、引数が何も展開されないため、これは失敗します。一方
if [[ _$str = _ ]]
動作しますが、クラッジです。