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 |