2015-09-01

Bash の意外な落とし穴

Bash で if 文の代わりに &&|| を使うと1行になって見た目がすっきりする。

# (A)
if [ -n "$MSG" ]; then
    echo "$MSG"
fi
# (B)

[ -n "$MSG" ] && echo "$MSG"
# (C)

ところがこの2つは完全に等価ではない。前者では (B) の地点で return code ($?) が (A) の地点と変わらないのに対して、後者での (C) 地点での return code は以下のようになる:

  • [ ] 内の条件が成立したとき: && の後の文の return code が return code となる。
  • [ ] 内の条件が成立しないとき: 1 が return code となる。

スクリプトの最後に上記のような条件文を書く場合に && の形で書くと、想定外にスクリプトが 1 を返す(つまり失敗とみなされる)ので注意が必要だ。