シェルスクリプトの変数が空であることをテストする

シェルスクリプトの変数が空であることをテストする

変数が空であるかどうかをテストするために、さまざまなシェルで次の手法が何度も使用されていることを確認しました。

if [ "x$1" = "x" ]; then 
    # Variable is empty
fi

より正式なアプローチと比較してこれを使用すると、どのような利点がありますかif [ -z "$1" ]?これが移植性の問題ですか?

答え1

[ -n = "" ]一部の歴史的シェルは、演算子のように見える最初のオペランドと混同し、それを解析したり構文エラーを=引き起こす可能性[ -n = ]がある非常に単純なパーサーを実装しています。でプレフィックスは演算子のように見えないことを保証するので、[ "x$1" = x"" ]シェルがこのテストを解析する唯一の方法は、それをバイナリ演算子として扱うことです。xx"$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

関連情報