遠き君へ

〜インターネットの最果てで自分語りを垂れ流したり垂れ流さなかったりするブログ〜

【bash】bashの-eオプションとgrepを同時に使うときは注意

grepコマンドは、行が見つからなかった場合にリターンコードとして1を返します

$ echo hoge fuga | grep hoge ; echo $?
hoge fuga
0
$ echo hoge fuga | grep foo ; echo $?
1

一方、シェルスクリプト-eオプションを渡していると、途中の実行でリターンコードが0以外になったらそこで終了してしまいます。

-eオプションは引数で指定する以外にも、シェバン(1行目の#!)に書いたり、もしくはJekinsの古いやり方(not jenkinsfile)を使っていて「シェルスクリプトの実行」で直接スクリプト書いている場合にも有効です。


で、Jenkinsの「シェルの実行」内で以下のような処理を書こうとしました。

# ${output}に処理の実行結果が入っている
error=`echo ${output} | grep Error`
if [ "${error}" != "" ]; then
    exit 1
fi

// 別の処理に続く……

はい、これは${output}Errorが含まれていてもいなくてもifの付近で処理が終了します……/(^o^)\ - 含まれているなら、"${error}" != ""trueになってexit 1が実行される(こちらは意図通り) - 含まれていない場合は、そもそもecho ${output} | grep Errorの時点でリターンコードが1になって終了……

例えば以下のようにcatでリターンコードを上書きすると意図通りに動きます。

# ${output}に処理の実行結果が入っている
error=`echo ${output} | grep Error | cat`
if [ "${error}" != "" ]; then
    exit 1
fi

// 別の処理に続く……

そもそも${output}のところの処理で、ちゃんとリターンコード返せてないのが問題なんですけどね…‪…

background image is created by Niellyn & bhsav.