bashスクリプトのexit 0、exit 1、exit 2の意味


49

私はいくつかの練習問題をやっています。

引数として月番号を指定し、この番号を月名に変換するスクリプトを作成します。結果は標準出力に出力されます。

私は解決策を作りました:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=$1
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

exit 1, exit 0exit 2意味し、なぜ使用するのですか?


5
正常に実行されたコードはコード0で終了します。他の値はエラーを示します。インスタンスを参照してください特別な意味を持つの終了コード
V.オルセン

2
bashスクリプトは映画館のようなもので、異なるものがあります。exitステートメントは、bashインタープリターの出口の位置をマークします。スクリプトが起動されると、インタープリターは最も近い出口まで実行する必要があります。
DepressedDaniel

5
これがあなたが書いたコードだとしたら、どうしてあなたも理解していない文を使ったのでしょうか?
ドミトリーグリゴリエフ

5
1)質問を投稿した直後に回答を受け入れました。さらに良い回答が得られるまで24時間お待ちください。2)受け入れられた答えは間違っていて誤解を招く。正解は、「終了コードのデフォルトの意味はありません(0 =成功を超える)。スクリプト開発者としてのセマンティクスを定義します」。3)そのスクリプトを作成した場合、なぜexitコマンドを追加したのか(それらはすべて論理的に不要であるか、if-elseを使用するため「exit 1」に折りたたむことができます)。
-AnoE

回答:


58

シェル終了コードの良いリファレンスは次のとおりです。

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

警告:適切な終了コードを使用することは必須ではなく、シェルによって強制されません。開発者は、賢明だと思う場合、ガイダンスを無視できます。


8
ただし、注意してください。終了コードの意味は、プログラムの開発者次第です。
ムル

また、リンクされたソースであるAdvanced Bash Scripting Guideは、「Reserved Exit Codes」(オリジナルの強調)を表示すると主張していますが、その主張は引用されておらず、完全に偽です。
エリアケイガン

23

exitと数字を使用することは、スクリプトの結果を知らせる便利な方法です。これは、bashコマンドが戻りコードを出力する方法を模倣しています。bashコマンドでは、戻りコード0は通常、すべてがエラーなしで正常に実行されたことを意味します。exitまた、スクリプトはその時点で実行を停止し、コマンドラインに戻ります。

0より大きいリターンコードは何らかのエラーを示しますが、エラーは重大ではない場合もありますが、各コマンドについて、各リターンコードの意味を説明するドキュメントを見つけることができるはずです。

次の$?ようなシェル変数を使用して、最後のbashコマンドのリターンコードを取得できます。

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

スクリプトでこれを使用すると、実行の完了時に同じ方法で戻りコードを照会できます。したがって、次のことがわかります。

exit 2
exit 0

あなたはそのexit 0部分に到達することはできないので、無意味です。


3

それ自体はexit、終了値ゼロ、またはスクリプトの正常終了を意味します。正常に完了したことを示すために、終了コマンドにゼロ引数を追加する必要はありません。スクリプトはエラー状態をテストしますが、正常に終了する可能性があります(またはおそらく終了します)。この場合、特にエラー(または1)状態で終了するようにします。

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

exit最後の行のコマンドは、必ずしもそこにある必要はありません。ゼロで呼び出すことも、まったく呼び出さないこともできます。exitコマンドに1引数を指定しないと、これらすべての場合の答えはecho $?ゼロになります。

ただし、exitコマンドに1引数を指定すると、応答echo $?は1になります。したがって、スクリプトがエラー状態で終了したことを指定する場合は、exitコマンドに1引数を使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.