変数が空であるかどうかをテストするために、さまざまなシェルで次の手法が何度も使用されていることを確認しました。
if [ "x$1" = "x" ]; then
# Variable is empty
fi
より正式なアプローチと比較してこれを使用すると、どのような利点がありますかif [ -z "$1" ]
?これが移植性の問題ですか?
ベストアンサー1
[ -n = "" ]
一部の歴史的シェルは、演算子のように見える最初のオペランドと混同し、それを解析したり構文エラーを=
引き起こす可能性[ -n = ]
がある非常に単純なパーサーを実装しています。でプレフィックスは演算子のように見えないことを保証するので、[ "x$1" = x"" ]
シェルがこのテストを解析する唯一の方法は、それをバイナリ演算子として扱うことです。x
x"$1"
=
すべての現代的なシェル、そしてまだ動作しているほとんどの古いシェルも次のとおりです。POSIXルール正しく解析するには、最大4単語までのすべてのテスト式が必要です。だから[ -z "$1" ]
$1
空であることをテストする正しい方法です。、[ "$x" = "$y" ]
両方の変数の同等性をテストする正しい方法です。
一部の現在のシェルはより長い式と混同される可能性があり、一部の式は実際にあいまいなので、長いブールテストを構成するためにand演算子を使用せず、-a
代わりに別々の呼び出しシェル所有およびブール演算子を使用してください。-o
[
&&
||