【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}
のところの処理で、ちゃんとリターンコード返せてないのが問題なんですけどね……