本文へスキップ
BecomeCoder

シェルスクリプトコース · 第3章 引数と入出力 · レッスン14

終了ステータス ― 成功か失敗かを伝える

ブラウザで完結

導入

コマンドは、結果の文字だけでなく 「うまくいったかどうか」 も返しています。それが終了ステータスです。この値を見て次の処理を決めるのが自動化の要で、第4章の条件分岐もこの上に成り立っています。

説明

すべてのコマンドは、終わるときに 0〜255 の数値を返します。

  • 0 = 成功
  • 0 以外 = 失敗(1が一般的なエラー、127はコマンドが見つからない、など)

直前のコマンドの終了ステータスは $? で取り出せます。

#!/bin/bash

ls logs > /dev/null
echo "ls の結果: $?"

cat noexist.txt 2> /dev/null
echo "cat の結果: $?"

# 自分のスクリプトも、成功/失敗を返せる
echo "終了します"
exit 0

「成功が0」は直感に反しますが、失敗の種類はたくさんあるから番号を割り当てたい、と考えると腑に落ちます。

この値を使うと、コマンドを条件でつなげられます。

書き方意味
A && BA が成功したら B を実行
A || BA が失敗したら B を実行
mkdir backup && echo "作成しました"
cat noexist.txt || echo "読めませんでした"

自分のスクリプトも exit 数値 で結果を返せます。exit 0 で成功、exit 1 で失敗。このスクリプトを別のスクリプトから呼ぶときに、この値が判断材料になります。呼ばれる側になったつもりで、正しい値を返す習慣をつけましょう。

exit はそこでスクリプトを終了させます。エラーを見つけたら echo "エラー内容" >&2 でメッセージを出し、exit 1 で止める——これが定番の型です(>&2 は標準エラー出力へ出す指定)。

やってみよう

スクリプトを実行して、成功したコマンドの $?0、失敗したコマンドが 0 以外になることを確かめましょう。次に端末で ls && echo OKcat noexist || echo NG を打って、&&|| の動きも見てください。

演習

失敗するコマンド(例: cat noexist.txt)のあとに || を使って、読み込みに失敗しました と表示してください。

ヒント1を見る

「失敗したら実行する」は コマンド || 別のコマンド です。

ヒント2を見る

cat noexist.txt 2> /dev/null || echo "読み込みに失敗しました"

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。