回答:
いくつかの歴史的なシェル[ -n = "" ]
は、最初のオペランドが=
演算子のように見える場所などによって混乱する可能性のある非常に単純なパーサーを実装し、これを[ -n = ]
構文エラーまたは構文エラーを引き起こす可能性があります。では[ "x$1" = x"" ]
、x
プレフィックスx"$1"
によって演算子のように見えないことが保証されるため、シェルがこのテストを解析できる唯一の方法は=
、バイナリ演算子として扱うことです。
すべての最新のシェル、およびまだ動作中のほとんどの古いシェルでさえ、最大4ワードのすべてのテスト式を正しく解析することを義務付けるPOSIXルールに従います。だから、[ -z "$1" ]
テストの適切な方法があればある$1
空であり、[ "$x" = "$y" ]
二つの変数の等価性をテストするための適切な方法です。
いくつかの現在のシェルでさえ長い式と混同される可能性があり、いくつかの式は実際にはあいまいです。そのため、-a
and -o
演算子を使用して長いブールテストを作成するのを避け、代わり[
にシェルの独自の呼び出し&&
と||
ブール演算子を使用してください。
[ -z "$1" ]
場合、テストする適切な方法です$1
。sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'
-両方とも0を返しますが、2番目の場合$1
は存在しないため空にできません。
http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.htmlによれば、一部の実装では、おそらく「興味深い」文字列がテストされる場合、-z
テストは安全ではありません"-o a=a"
。
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
=
と比べ-z
、今どのようにして、。
sh
かの商用Unices上のksh88ベースのsにはまだ問題があります。詳細はこちらをご覧ください。