if文でコマンド実行結果の戻り値を判定する

さてさて、またしてもシェルスクリプトです。


シェルスクリプトではコマンドを実行して、コマンドの戻り値によって処理を変えるなんてことがあるかと思います。

#!/bin/sh

echo "$1" | grep 'a'

if [ "$?" -eq 0 ]
then
  echo 'has a'
else
  # 英語自信ない
  echo 'has not a'
fi

このスクリプトの場合、$1に'a'が含まれていればgrep 'a'で一致する箇所があるということになるので、戻り値の$?は0となり、'has a'が表示されますね。


普通に書くならこれで良いのですが、set -eを指定した場合はどうするか……
そもそもデバッグ目的以外でset -eを使うのが正しいのかどうなのかはわかりませんが。(普通に使われてるのかな?)


上記の方法で書こうとしても、grep 'a'を実行して一致しなかった時点でスクリプトが終了します。
方法が無いのかと思っていたのですが、以下の方法で出来るようです。

#!/bin/sh

set -e

# ifでtestも/bin/[も使わない!
if echo "$1" | grep 'a' > /dev/null
then
  echo 'has a'
else
  echo 'has not a'
fi

ただまあ……0かそれ以外か、しかわかりませんが。
set +eをして一時的にエラーを無視するのが良いのかもしれません。