Edited at

シェルスクリプト(bash)の「 [ ] 」と「 [[ ]] 」の違い

More than 1 year has passed since last update.

[]では予期せぬ変数展開でエラーが発生する場合があるので[[ ]]を使う。

※本来は使い分けるべきなのだろうが、現状[[ ]]のみでこと足りている

エラーの例:

if [ `echo "Count aaaa " | grep Count` ] ; then

echo 'OK'
fi

./test.sh: line 4: [: Count: unary operator expected

if [ `echo "Count aaaa , bbb" | grep Count` ] ; then

echo 'OK'
fi

./test.sh: line 4: [: 引数が多すぎます

[[ ]]だと問題ない:

if [[ `echo "Count aaaa " | grep Count` ]] ; then

echo 'OK'
fi

OK

if [[ `echo "Count aaaa , bbb" | grep Count` ]] ; then

echo 'OK'
fi

OK

[]でも問題ない場合もある

if [ `echo "Count" | grep Count` ] ; then

echo 'OK'
fi

OK

以下のコードでファイルの中身によってエラーが出たり出なかったりで地味にハマりました。

cat test.txt | while read LINE;do

if
[ `echo $LINE | grep Count` ] ; then
echo 'OK'
fi
done

※以下のように正規表現を使う場合、[[ ]]を使うことはよく知られています

if [[ $name =~ hogehoge ]] ; then

echo match
fi