bashの[[]]と[]
bashで条件式を書きたい時、書き方は[[ 条件式 ]]と[ 条件式 ]の2通りあります。どちらも「カッコ内の条件が真なら」という意味になるのですが、[[ 条件式 ]]はほぼ[ 条件式 ]の上位互換です。というのはカッコ内に&&, ||が使えたり、()<>などを引用符で囲ったりしなくてすむのでより使い勝手がいいです。
ただ、数少ない例外がパス名展開をファイルに対して使いたい時です。
例えば、DWI.niiという名前か、DWI.nii.gzという名前か、どちらでも良いのでファイルが存在する時に何かの処理をしたいとします。(-eは「次のファイルが存在するなら」という意味の条件式です)
[[ -e DWI.nii* ]]
これだと*は展開されずにそのまま残ってしまいます。当然、DWI.niiにも、DWI.nii.gzにもマッチしません。
[ -e DWI.nii* ]
こちらは*が展開されて、0文字以上の文字にマッチします。つまりあってもなくてもいいので、DWI.niiとDWI.nii.gzの両方にマッチします。
最近ほとんど[[]]しか使わなくなっていましたが,
意外と[]にも出番が残っていそうです。
ちなみにファイルの評価ではなく、文字列の評価の時場合には、==の右側に*があれば、[[条件式]]でも展開してくれます。
str=xyz
[[ $str == x* ]]
こちらはx*が展開されてxyzにマッチします。
試した環境はこちらになります。
$ bash --version
GNU bash, バージョン 5.1.16(1)-release (x86_64-pc-linux-gnu)