シェルのよくあるif [と if [[の違いが最近わかった

if [[ ]] とかく人と、if [ ] とかく人がいるけれども、単なる流派だとってた。

もしくは、[ ] という構文の中に []を入れることによって、文法的になんかいい恩恵がえられるんじゃないかと、
そう思っていたけれども、全然違っていた。

ええ、コマンドなのこれ?

[ ってコマンドだった。
which [ と実行するとコマンドの場所が出るんでしょ、
うちのArchLinuxでは/usr/bin/[と表示された。

つまり、[というファイル名の実行ファイルがあるということだ。
ちなみにこれは、引数の最後に]がないと怒るというタイプのコマンドだった。

bashとかzsh、ksh、cshなど色々なシェルが存在するが、[はそれらとは独立した別のコマンドで、そこに渡された条件の引数の結果を渡してくれる。

なお、条件式に対して真偽を返すコマンドとしてtestコマンドというものがあるが、[はそれと同じ様に同様のものなんだろう。そもそも元々はtestコマンドが先にあって、それをよりほかの言語っぽくかけるためにできたのだと思う。

一方で[[ ]] はbashなどのシェルに元々ある文法上のものであってコマンドじゃない。
[[ ]] は同じ様にtestコマンドの代わりとして使えるけれども、
こっちはシェル独自の仕様のものなので、[と違って動きが異なることがありそう

調べてみた結果、[はコマンドなので、エラーメッセージが出ることがあるようだね。
でも、挙動については違いはないように見える。

実はある環境で-fでの通常ファイルかどうかの判定でワイルドカードが使用できたパターンがあったのだが、その時は[を使っていた。
バージョンなどにより変わるのだろうか
追って調査を続けてみたいと思う。

スポンサードリンク

関連コンテンツ