なっく日報

技術やら生活やらのメモ

シェルスクリプトのif文で見かける[と[[と((の違い

シェルスクリプト(というか↓はzshだけの文法も含まれますが)のif文でいろんな書き方が出てきてワケワカメ状態を脱したのでメモ。

これらの違いは何?

a='hoge'

if [ "$a" = 'hoge' ]; then
  echo 'if ['
fi

if [[ "$a" == 'hoge' ]]; then
  echo 'if [['
fi

if (( $+commands[nodebrew] )); then
  echo 'if (('
fi

答え

if [ ]

これはいつものやつ。

if [[ ]]

test と [ と [[ コマンドの違い - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blogによれば、[の高機能版だそう。

変数展開等もダブルクォート不要だったり。

こちらを使っておいたほうが間違いない。

if (( ))

https://sites.google.com/a/tatsuo.jp/programming/Home/bash/hentai-bunpou-saisoku-masuta#TOC--6によれば、(( ))は算術演算子だそう。

評価した式の結果が 0 なら返り値 1、それ以外の場合には返り値 0 となります

❯ (( 1 )) && echo 1
1

❯ (( 0 )) && echo 0

となる。

ちなみに$+commands[nodebrew]分岐の zsh っぽい書き方 - Qiitaをみて思い出しました(ちなみに自分の.zshrcでも使っていましたが、使い方が間違っていた模様。。)

コマンドがなければ0、あれば1を返します。

まとめ

積年の疑問が氷解してスッキリ。