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

シェルスクリプトの戻り値の実装とその利用シーン

2022-02-09 12:07:42

アプリケーションシナリオ

Jenkinsなどのアプリケーションでは、シェルスクリプトが埋め込まれており、システムはシェルスクリプトの戻り値で実行結果を判断している場合があります。戻り値が0でない場合は、実行エラーが発生したため、実行を中断する必要がありますが、これは単一のコマンドを使用する場合には問題ではありません。しかし、シェル(A)スクリプトが順番にシェルスクリプトファイル(B )を呼び出す場合、呼び出されたシェルスクリプトB の実行中にエラーが発生しても、システムはB に問題があるとは考えず、そのまま続行する。このため、問題が隠蔽されてしまう。

解決する

呼び出されたシェルスクリプトBでエラーが発生したときに、そのエラーコードをキャッチして返すことで、システムが呼び出されたシェルスクリプトBのエラーコードをキャッチして、時間内に実行を中止できるようにすること。

1. 実装手順です。

(1)実行結果コードを取得する。取得するには、"$?"を使用します。

(2) 実行結果コード検出機能を追加し、結果コードが0以外であることが判明した場合、スクリプトの実行コードを返すようにする。これには "exit [code]" を使用します。

2. 例

シェルA

#do something ...
/home/test/B.sh
#do something ...


シェルB(/home/test/B.sh)です。

check_result()
{
 echo input params:$1

 if [ $1 ! = 0 ]; then
  echo wahaha
  exit $1
 fi
}

ls /
echo 1.result:$?
check_result $?

cat /xxxyyy
v1=$?
echo 2.result:{v1}
check_result $v1


check_result()は、シェルスクリプトの実行を停止し、コマンドのリターンコードが0以外の場合にそのコードを返す定義済み検出関数です。
v1=$? コマンド実行時のリターンコードを一時変数として保存します。後で使用するために保存しておく必要があります。

付録

1.シェルのリターンコード

フォームD-1. "Reserved"exit code

<テーブル <カラー <カラー <カラー 終了コードの値 意味 例 コメント 1 一般的なエラー var1 = 1/0" とします。 0で割るエラーなど、さまざまなエラーがこの終了コードを使用する可能性があります。 2 シェル組み込みコマンドの使用エラー(Bashのドキュメントに記載されています。) まれに見る、通常終了コードは1です。 126 コマンドコールが実行できない プログラムまたはコマンドのパーミッションが実行可能でない 127 コマンドが見つかりませんでした。 おそらく$PATHが正しくないか、スペルが間違っているのでしょう。 128 終了時のパラメータエラー 出口 3.14159 exit は引数として 0 から 255 までの整数値のみを取ることができます。 128+n シグナル"n"で致命的なエラーが発生しました。 PPID のための kill -9 スクリプト $? 137(128 + 9)を返します。 130 Control-Cでスクリプトを終了させる Control-Cはシグナル2のフェイタルエラー、(130 = 128 + 2、上記参照) 255* 範囲外の終了ステータス 出口-1 exit コマンドは、引数として 0 ~ 255 の範囲の整数しか受け付けません。

2. シェルのリターンコードと関数のリターンコード、コマンドのリターンコードの違いについて

  • スクリプト全体の実行結果の状態を識別するシェルのリターンコードは、"exit return code"で表されます。
  • 関数の結果状態を識別する関数のリターンコードは、"return code"で表わされます。
  • コマンドリターンコード、コマンドの結果の状態を識別するもので、コマンド実行直後に "$?"で取得します。

シェルスクリプトの戻り値とその利用シーンについての説明は以上となります。シェルスクリプトの戻り値についての詳細は、過去の記事を検索していただくか、以下の記事を引き続きご覧ください。