test コマンドを書く時は・

testコマンドの注意点

以下のような記述はよろしくない。

if [ ${VAR} = ""]; then
  echo "true"
else
  echo "false"
fi

if [ ${VAR} != "" ]; then
  echo "true"
else
  echo "false"
fi


上記は VAR が空であった場合、以下のように展開されるため test コマンド自体がエラーとなる。

if [  = ""]; then
if [  != "" ]; then

test コマンドが失敗した結果、上記の例だと、いずれも false が表示される。つまり、論理記述の違いに関わらずに、if-else の else 内が実行される。


入力パラメータの必須チェックなど、"${VAR}"と記述するべきで、さらに安全側へ倒す意味で、

if [ "${VAR}" != ""]; then
  echo "パラメータOK"
else
  echo "パラメータ未入力エラー"
  exit 1
fi

のように実装したい。このように実装することで、testコマンドにおけるエラーがあった場合でも、else 内が実行されることになり、確実に処理を止めることができる。

test コマンドのオプション

おまけ。

ファイルに関するテスト
-r file fileが読み取り可能なら真
-w file fileが書き込み可能なら真
-x file fileが実行可能なら真
-f file fileが普通のファイルなら真
-d file fileがディレクトリなら真
-s file fileが0より大きいサイズなら真
文字に関するテスト
-z string stringの長さが0なら真
-n string stringの長さが0より大なら真
string stringがnullでなければ真
str1 = str2 str1とstr2が同じなら真
str1 != str2 str1とstr2が同じでないなら真
数値に関するテスト
int1 -eq int2 itn1とint2が等しいなら真
int1 -ne int2 itn1とint2が等しくない真
int1 -lt int2 itn1がint2より小さい(less than)なら真
int1 -le int2 itn1がint2以下(less than or equal)なら真
int1 -gt int2 itn1がint2より大きい(greater than)なら真
int1 -ge int2 itn1がint2以上(greater than or equal)なら真

その他

! NOT
-a AND
-o OR