1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルの終了ステータスの使用

2022-02-07 03:58:49

すべてのシェルコマンドは、Bash 組み込みのコマンド (例: cd, echo)、Linux の外部コマンド (例: ls, awk)、カスタムシェル関数を問わず、終了時に比較的小さな整数値を呼び出した (使用した) プログラムへ返します。

Linuxのコマンドの多くは、実はC言語プログラムであり、C言語に詳しい読者は、main()関数の最後にreturn 0があり、途中でプログラムを終了したい場合は、exit 0も使えることを知っていると思いますが、実はこれはC言語プログラムの終了ステータスなのです。これは、実はC言語のプログラムの終了状態です。他のプログラムがこのプログラムを呼び出すと、この終了ステータスを捕捉することができます。

if文の条件は、要するに、コマンドの終了ステータスです。

慣習上、終了ステータス0はquot;成功;つまり、プログラムが完了し、何の問題も発生しなかったことを意味します。0 以外の終了ステータスは失敗です。

diff コマンドは 2 つのファイルを比較し、違いがない場合は 0、違いが見つかった場合は 0 を返します。差分がないファイルには0、差分が見つかったファイルには1、無効なファイル名には2が返されます。

プログラミング経験のある方は、シェルのこの部分が他のプログラミング言語と逆になっていることに注意してください。C、C++、Java、Pythonでは、0は"false"、他の値は"true"です。

シェルでは、コマンドの終了状態を取得する方法がいくつかありますが、その中でも$? 前節のShell if elseでは、数学の計算に(())を使いましたが、その終了状態を見てみましょう。次のようなコードを考えてみましょう。

#! /bin/bash
read a
read b
(( $a == $b ));
echo "Exit status: "$?


実行結果1。
26
26
終了ステータス 0

結果2を実行します。
17
39
終了ステータス 1

終了状態と論理演算子の組み合わせ

シェルのif文のすごいところは、論理演算子を使って複数の終了状態を組み合わせることで、複数の条件を一度に判断できることです。

シェルの論理演算子

<テーブル 演算子 フォーマットの使用 説明 && 式1 && 式2 論理演算子で、expression1 と expression2 の両方が成立するとき、式全体が成立します。
expression1の終了状態が0と検出された場合、expression2の終了状態に関わらず式全体は必ず無効であり、検出することは冗長であるため、expression2は検出しない。 || 式1|式2 論理演算子 or です。expression1 と expression2 のどちらかが成立すれば、式全体が成立する。
expression1 の終了ステータスが 1 であることを検出した場合、expression2 の終了ステータスに関係なく式全体が保持される必要があり、それを検出するのは冗長になるため、expression2 は検出されません。 ! !式 論理的な非演算子で、"inverse"効果と等価です。expressionがtrueの場合、expression全体はtrueでなく、expressionがtrueでない場合、expression全体はtrueになります。

[例)ユーザーが入力したURLをファイルに書き出す。

#! /bin/bash
read filename
read url
if test -w $filename && test -n $url
then
  echo $url > $filename
  echo "Writing successful"
else
  echo "Write failed"
fi


シェルスクリプトファイルのあるディレクトリに新しいテキストファイルを作成し、urls.txtと名付け、シェルスクリプトを実行した結果

urls.txt ↙。
http://jb51.net/shell/
書き込み成功

wオプションはファイルが存在し書き込みが可能かどうかを、-nオプションは文字列が空でないかどうかをチェックするために使用します。これについては、次節の「シェルテスト」で詳しく説明します。

デフォルトのechoはコンソールに出力されますが、ここではファイルにリダイレクトしています。

Shell Exit Stateの使い方に関する記事です。Shell Exit Stateの詳細については、Script Houseの過去記事を検索するか、以下の関連記事を引き続き閲覧してください。