Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Bash | if の中に書くアレを単体で書くと終了コードが変わる

More than 3 years have passed since last update.

検証

条件式だけを単体で書き、その後の終了コードの変化を見てみる。

exit_code.sh
echo exit code is $? at first

[[ 'A' == 'A' ]]

echo exit code is $? after matched

[[ 'A' == 'B' ]]

echo exit code is $? after not matched

結果

マッチに失敗した後の終了コードが、エラーを示す 1 に変わっているのが分かる。

exit_code.sh
$ bash exit_code.sh

exit code is 0 at first
exit code is 0 after matched
exit code is 1 after not matched

コード的解決策

「if 文を書きたくない、&& でつなげて簡潔に書きたい」という場合は、最後に || true を入れてあげれば良さそう。

i_want_simple_syntax.sh
[[ $WORD == 'A' ]] && echo 'WORD is A' || true
[[ $WORD == 'B' ]] && echo 'WORD is B' || true

echo exit code is $?

結果

$ WORD=A bash i_want_simple_syntax.sh

WORD is A
exit code is 0

if 文の中での検証

では、 if 文の中ではどうなるのだろう。

exit_code_in_if.sh
echo exit code is $? at first

if [[ 'A' == 'A' ]]
then
  echo exit code is $? in matched if 
fi

echo exit code is $? after matched if

if [[ 'A' == 'B' ]]
then
  echo a is b
else
  echo exit code is $? in not matched else
fi

echo exit code is $? after not matched if

結果

この場合は「マッチしなかった判定の else の中」でだけ、終了コードが変わっているのが分かる。

どうやら if は終了コードの変化を「閉じ込めて」くれるらしい。
というより、その仕組を利用したのが、そもそも if / then / else なのかも。

$ exit_code_in_if.sh

exit code is 0 at first
exit code is 0 in matched if
exit code is 0 after matched if
exit code is 1 in not matched else
exit code is 0 after not matched if

環境

  • bash 3.2

参考

YumaInaura
Ruby on Rails 業務経験 約5年 / Perl PHP Python Golang Linux Apache MySQL BigQuery Jenkins ansible AWS など / いなうらゆうま / YumaInaura / 稲浦悠馬
http://twitter.com/yumainaura
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away