シェルスクリプトで使用することの多い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環境では[[
コマンドを用いたほうが便利そうだと感じました。