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 $?

のように書ける。

参考


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS