シェルのexit codeとif
https://gyazo.com/621f84467541f26c8be233fb88b3ae3e
失敗、成功をどう判断している?
exit code
プロセスの終了時に遺していく数値
ダイイングメッセージ的なもの
成功時は0
失敗時はそれ以外(コマンドによってエラーの種類ごとに変えている場合も)
https://gyazo.com/717e59ee697a2c6fd91bf4689846b2c0
&&、||、!
プログラミング言語では論理演算子としておなじみ
シェルスクリプトでは
&&: 左辺の exit code が0なら右辺を実行
||: 左辺の exit code が0以外なら右辺を実行
!: 右辺のexit code が 0 なら1を、それ以外なら0でexit
成功時、失敗時の処理が書ける
code:sh
# might-fail が成功時のみ、when-successを実行
might-fail && when-success
# might-fail が失敗時のみ、when-failを実行
might-fail || when-fail
シェルスクリプトだけでなく、長時間かかるコマンドを実行するときも便利
code:sh
takes-long-time && say "success!"
takes-long-time || say "fail!"
takes-long-time; say "done!"
true、false
プログラミング言語では真偽値のリテラル
シェルスクリプトでは
true: 絶対にexit code が 0 になる(=成功する)コマンド
false: 絶対にexit code が 1になる(=失敗する)コマンド
プログラミング言語でよくある0/1と真偽値の対応とは違うので注意
シェルスクリプトやGHA Workflow でファイルが存在するなら消すという処理が書ける
(シェルスクリプトではset -e時)
code:sh
# hoge があれば消し、なければエラーを無視(スクリプトを止めない)
rm hoge || true
if コマンド
code:if
if test-commands; then
consequent-commands
else
alternate-consequents
fi
test-commands のexit code が0であればconsequent-commands、それ以外だとalternate-consequentsを実行
try-catch 的なことができる
code:if
if might-fail; then
when-success
else
when-fail
fi
testコマンドと[コマンド
ここで man test を実行
まとめ
シェルの世界の論理演算(?)はユニークで面白い
GHA Workflow やシェルスクリプトを書くときに役立ててください