シェルスクリプトで使用することの多いtest([)コマンドと[[コマンドの違いについて、混同することが多いのでまとめてみました。
testコマンド([コマンド)
-
以下の2通りの書き方のどちらでもOK
[ $# -lt 2 ]test $# -lt 2
-
-o(OR)、-a(AND)で複数条件を指定できる[ $# -lt 2 -o ! -e "$1" ]
-
使用例
- 第1引数で指定されたディレクトリが存在するか?
[ -d $1 ]
- 第1引数で指定されたファイルが存在するか?
[ -f $1 ]
- 第1引数の長さがゼロでないか?
[ -n $1 ]
- 第1引数の長さがゼロか?
[ -z $1 ]
- 第1引数の値が5と等しいか?
[ $1 -eq 5 ][ $1 = 5 ]
- 他には、
-ne(!=),-gt,-ge,-lt,-leといった比較演算子を利用可能。 -
=,!=はコマンドとして使用できるが、不等号は利用できない
- 第1引数で指定されたディレクトリが存在するか?
-
不等号を利用したい場合は、算術演算に用いられる
((コマンドを用いる- 使用例
(( x > y ))(( x >= y ))
-
((コマンドはループカウンタの更新等にも用いることができる(( COUNT++ ))
- 使用例
[[コマンド
-
bash,zsh等で使用できる。Bourne Shell(sh)では利用できないので注意
-
testコマンドとの違い変数展開時にワード分割されない
-
変数名を
""で囲わなくても良い$ name='hoge taro' $ [ $name = "hoge taro" ];echo $? -bash: [: too many arguments 2 $ [ "$name" = "hoge taro" ];echo $? 0 $ [[ $name = "hoge taro" ]];echo $? 0
パターンマッチが利用できる
- なお、拡張正規表現を用いる場合は
=~を利用する必要がある$ [[ abc = ab* ]];echo $? 0 $ [ abc = ab* ];echo $? 1
<,>が利用できる-
((コマンドと違い、<=,>=は利用できない
&&,||が利用できる。- 複数条件を指定する際に、
&&,||を利用できるが、testコマンドで使用する-a,-oは利用できない
-
まとめ
基本的に、bash,zsh環境では[[コマンドを用いたほうが便利そうだと感じました。