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)
n1=10; n2=7 if [ "$n1" -gt 5 -a "$n2" -gt 5 ]; then echo OK; fi
-o (OR)
n1=5; n2=10 if [ "$n1" -gt 7 -o "$n2" -gt 7 ]; then echo OK; fi
複雑な組み合わせ
n1=1; n2=10; n3=10 if [ \( "$n1" -gt 5 -a "$n2" -gt 5 \) -o "$n3" -gt 5 ]; then echo OK; fi
複雑な条件式の場合、複合コマンド[[]]を利用するのが無難。上のような通常のテストコマンドではn1が未定義などの場合、エラーが発生するので。
否定
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 $?
のように書ける。