web-dev-qa-db-ja.com

シェルスクリプトのifブロックでexitは何をしますか?

UNIXシェルスクリプトについて質問があります。

あなたがするなら言うexit 1 in inner if:終了するか、それとも外部ifを実行しますか?以下はダミーの例です。

if [ "$PASSWORD" == "$VALID_PASSWORD" ]; then
    if [ "$PASSWORD" -gt 10]; then
        echo "password is too large!"
        exit 1
    fi
    echo "You have access!"
    exit 1
fi
4
jamesT

exitは通常Shellビルトインなので、理論的には使用しているShellに依存します。ただし、現在のプロセスを終了する以外に動作するシェルを認識していません。 bashのmanページから、

   exit [n]
          Cause the Shell to exit with a status of n.  If  n  is  omitted,
          the exit status is that of the last command executed.  A trap on
          EXIT is executed before the Shell terminates.

したがって、現在のif句を単に終了するのではなく、シェル全体(または、スクリプトはシェルプロセス内で実行されているため、本質的にはプロセス)を終了します。

Man shから、

 exit [exitstatus]
        Terminate the Shell process.  If exitstatus is given it is used as
        the exit status of the Shell; otherwise the exit status of the
        preceding command is used.

そして最後に、男kshから、

   † exit [ n ]
          Causes  the  Shell  to exit with the exit status specified by n.
          The value will be the least significant 8 bits of the  specified
          status.   If  n  is omitted, then the exit status is that of the
          last command executed.  An end-of-file will also cause the Shell
          to  exit  except for a Shell which has the ignoreeof option (see
          set below) turned on.
5
EightBitTony

exitは、呼び出しプロセスを終了します。ほとんどの場合、ループ、関数、または含まれているスクリプト内から呼び出した場合でも、これはスクリプト全体を終了します。 exitを「キャッチ」する唯一のシェル構造は、サブシェルを導入するものです(つまり、 forked 子シェルプロセス):

  • サブシェルの括弧内のコマンドを実行する基本的なサブシェル構造_(…)_。
  • コマンド置換コンストラクト$(…)(および非推奨の同等物、バッククォート_`…`_)。コマンドを実行し、その出力を文字列として返します。
  • _&_で分岐したバックグラウンドジョブ;
  • パイプ _|_の左側、およびほとんどのシェルの右側(ATT kshとzshは例外)。
  • 一部のシェルには、他のサブプロセス構造があります。たとえば、ksh、bash、zshでのプロセス置換<(…)>(…)などです。

whileまたはforループから抜け出すにはbreakキーワードを使用し、関数から抜け出すにはreturnキーワードを使用します。

exitはスクリプトを完全に終了します。

breakは、ループでは1レベル高くなりますが、ifステートメントではそうではありません(私のbash-manpageによると)。

0
Nils