変数が空であるかどうかをテストするために、さまざまなシェルで次の手法が何度も使用されていることを確認しました。
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
[
&&
||
答え2
~によるとhttp://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html、-z
テストは一部の実装では安全ではありません"-o a=a"
、おそらく「興味深い」文字列をテストするときでしょう。
答え3
上記のテストは、「set -u」または「set -o nounset」を使用して実行してもエラーが発生します。
空の変数を確認するより信頼性の高い方法は、次の方法を使用することです。パラメータ拡張:
MYVAR=${MYVAR:-"無効な値"}
この方法は、伝統的なBourne Shell、ksh、bashで動作します。
答え4
function isBlank {
valueNoSpaces=$(echo "$@" | tr -d ' ')
if [ "$valueNoSpaces" == null ] || [ -z "$valueNoSpaces" ]
then
echo true ;
else
echo "" ;
fi
}
#Test
if [ $(isBlank " ") ]
then
echo "isBlank \" \" : it's blank"
else
echo " isBlank \" \": it is not blank"
fi
if [ $(isBlank "abc") ]
then
echo "isBlank \"abc\" : it's blank"
else
echo "isBlank \"abc\" :it is not blank"
fi
if [ $(isBlank null) ]
then
echo "isBlank null : it's blank"
else
echo "isBlank null : it is not blank"
fi
if [ $(isBlank "") ]
then
echo "isBlank \"\" : it's blank"
else
echo "isBlank \"\" : it is not blank"
fi
#Result
isBlank " " : it's blank
isBlank "abc" :it is not blank
isBlank null : it's blank
isBlank "" : it's blank