導入
コマンドは、結果の文字だけでなく 「うまくいったかどうか」 も返しています。それが終了ステータスです。この値を見て次の処理を決めるのが自動化の要で、第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 && B | A が成功したら B を実行 |
A || B | A が失敗したら B を実行 |
mkdir backup && echo "作成しました"
cat noexist.txt || echo "読めませんでした"
自分のスクリプトも exit 数値 で結果を返せます。exit 0 で成功、exit 1 で失敗。このスクリプトを別のスクリプトから呼ぶときに、この値が判断材料になります。呼ばれる側になったつもりで、正しい値を返す習慣をつけましょう。
exitはそこでスクリプトを終了させます。エラーを見つけたらecho "エラー内容" >&2でメッセージを出し、exit 1で止める——これが定番の型です(>&2は標準エラー出力へ出す指定)。
やってみよう
スクリプトを実行して、成功したコマンドの $? が 0、失敗したコマンドが 0 以外になることを確かめましょう。次に端末で ls && echo OK と cat noexist || echo NG を打って、&& と || の動きも見てください。
演習
失敗するコマンド(例: cat noexist.txt)のあとに || を使って、読み込みに失敗しました と表示してください。
ヒント1を見る
「失敗したら実行する」は コマンド || 別のコマンド です。
ヒント2を見る
cat noexist.txt 2> /dev/null || echo "読み込みに失敗しました"