web-dev-qa-db-ja.com

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

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

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

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

#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はどういう意味ですか、なぜそれらを使用するのですか?

44

これが良い例です シェル終了コードのリファレンス

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() {}

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

57
user535733

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部分に到達することは決してできないため、無意味です。

23
Arronical

単独で、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引数を使用します。

3
geekasaurus