遠き君へ

〜インターネットの最果てで自分語りを垂れ流すブログ〜

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.