testコマンド
文字列比較
"A" = "A" "A" != "B" -n "A" (文字列は空でない) -z "" (文字列は空)
数値比較
1 -eq 1 2 -gt 1 2 -ge 2 1 -lt 2 2 -le 2 2 -ne 1
比較対象が空文字列の場合
$ [[ "" -eq 0 ]] && echo OK OK
ファイル評価
-f file -d dir -r file (読み込み可能) -w file (書き込み可能) -x file (実行可能) -s file (サイズ0以上)
論理演算子
-a (AND)
foo=2 if [ -n "$foo" -a "$foo" -gt 1 ]; then echo foo is set and greater than 1 fi
-o (OR)
0 -o 1
否定
if [ ! -f /tmp/1.txt -a ! -f /tmp/2.txt ]; then echo "no 1.txt, no 2.txt" fi
戻り値判定
通常の判定
[ "a" = "a" ] && echo "OK"
if [ "a" != "b" ]; then echo "OK" fi
特殊変数$?による判定
[ "a" = "a" ] if [ $? -eq 0 ]; then echo "OK" fi
複合コマンド [[ ]]
[ 1 -lt 2 ]; echo $? # => 本来は-ltで数値比較する [ 1 < 2 ]; echo $? # => "<"で比較するとリダイレクトと判断されてエラーが起きる [ 1 \< 2 ]; echo $? # => "<"をバックスラッシュでエスケープするとエラーを回避できる [[ 1 < 2 ]]; echo $? # => 複合コマンド"[[ ]]"ならエスケープしなくてもエラーが起きない
グループ化
丸かっこ"()"でのグループ化でも複合コマンド"[[ ]]"は便利に使える。 丸かっこ"()"でくるんでグループ化する場合、通常は、
[ \( "a" = "a" \) -a \( "b" = "b" \) ]; echo $?
のように丸かっこ"()"をエスケープする必要がある。複合コマンド"[[ ]]"を使えば、
[[ ( "a" = "a" ) && ( "b" = "b" ) ]]; echo $?
のように書ける。