1. 概要

returnおよびexitコマンドは同様の目的で使用されます。 一般に、 return の目的は、 Bash関数を終了することですが、 exit の目的は、Bashスクリプトを終了することです。 ]。

このチュートリアルでは、いくつかの例を使用して、これら2つのコマンドの違いについて説明します。

2. returnコマンド

return は、Bash関数の実行を停止します。

return に整数引数を指定すると、その引数が終了ステータスとして関数呼び出し元に返されます。 それ以外の場合は、returnの前に実行された最後のコマンドの終了ステータスを関数呼び出し元に返します。

2.1. returnを使用してBash関数を終了する

次のBashスクリプトexamine_return.shを使用して、returnの動作を調べてみましょう。

#!/bin/bash

foo()
{
  if [ ! –z “$1” ]
  then
    return $1
  fi

  ls /non_existing_file >& /dev/null
  return 
}

foo 5
echo “The return value of \”foo 5\” : $?”
 
foo
echo “The return value of \”foo\”   : $?”

The foo() このスクリプトの関数は、を使用して引数を自分自身に渡すかどうかをチェックしますもしも [ ! –z“ $ 1”] 声明。 foo()関数に引数を渡すと、条件式が真になります。 この場合、関数は単に実行を停止し、 return $1ステートメントを使用して呼び出し元に引数として渡された値を返します。

に引数を渡さない場合 foo() 関数、次に条件式 [! –z“ $ 1”] falseになります。 この場合、実行はにジャンプします ls / non_existing_file>&/ dev / null 声明。 ファイルが存在しない場合、lsコマンドは2を返します。 次に、 foo()関数を終了し、引数なしでreturnを呼び出します。 実際、 return は関数の最後のコマンドであるため、明示的に呼び出すことは冗長です。

最後に、スクリプトで foo()関数を2回呼び出します。 最初の呼び出しでは、引数5を渡すことによって呼び出します。 2番目の呼び出しでは、引数を渡さずに呼び出します。 どちらの場合も、 echoコマンドと$?を使用して、関数の終了ステータスを出力します。

スクリプトexamine_return.shを実行して、結果を確認してみましょう。

$ examine_return.sh
The return value of ”foo 5” : 5
The return value of ”foo”   : 2

ご覧のとおり、結果は期待どおりです。 関数の引数として5を渡すため、最初の関数呼び出しの終了ステータスは5です。 一方、2番目の関数呼び出しの終了ステータスは次のとおりです。 2、 これはの終了ステータスであるため ls / non_existing_file>&/ dev / null コマンド、関数を終了する前に実行された最後のコマンド。

2.2. returnを使用してBashスクリプトを終了する

return を使用してスクリプトを終了するとどうなりますか? Examine_return_from_script.sh、以前に見たもののわずかに変更されたバージョンを使用して試してみましょう。

#!/bin/bash

foo()
{
  if [ ! –z “$1” ]
  then
    return $1
  fi

  ls /non_existing_file >& /dev/null
  return 
}

foo 5
echo “The return value of \”foo 5\” : $?”
 
foo
echo “The return value of \”foo\”   : $?”

return 0

この変更されたバージョンのスクリプトは、スクリプトの最後にある最後の return ステートメントという1つの追加を除いて、前のバージョンと同じです。 このスクリプトを実行してみましょう:

$ examine_return_from_script.sh
The return value of "foo 5" : 5
The return value of "foo"   : 2
examine_return_from_script.sh: line 20: return: can only ‘return’ from a function or sourced script

エラーが発生したため、returnを使用してスクリプトを終了することはできません。

ただし、スクリプトの出力が示すように、ソースコマンドを使用してスクリプトを実行できます:

$ source examine_return_from_script.sh
The return value of ”foo 5” : 5
The return value of ”foo”   : 2
$ echo $?
0

出力から明らかなように、スクリプトの終了ステータスは 0、であり、これは return0の結果です。

3. exitコマンド

exitを使用してBashスクリプトを終了します。 スクリプトのどこで呼んでも構いません。 たとえば、Bash関数の内部または外部でexitを呼び出すことができます。

return と同様に、整数の引数を取ることができます。 その場合、スクリプトは終了ステータスを整数引数に設定して終了します。 exit に引数を渡さないと、 exitの前に実行された最後のコマンドの終了ステータスに設定された終了ステータスで終了します。

3.1. Bash関数内でexitを使用する

次のスクリプトexamine_exit.shを使用して、Bash関数でのexitの動作を調べてみましょう。

#!/bin/bash

foo()
{
  if [ ! –z “$1” ]
  then
    exit $1
  fi

  ls /non_existing_file >& /dev/null
  exit
}

if [ ! –z “$1” ]
then
  foo $1
else
  foo
fi

echo “This line will not be printed”

このスクリプトのfoo()関数は、Examine_return.shの関数と非常によく似ています。 returnコマンドをexitコマンドに置き換えました。 また、スクリプトの最後に echo コマンドを追加して、exitの直後にスクリプトが終了することを証明しました。

後で、スクリプトで foo()関数を呼び出します。 引数を渡してスクリプトを実行する場合は、同じ引数を関数に渡して foo()関数を呼び出します。 引数なしでスクリプトを実行する場合は、引数なしで foo()関数を呼び出します。

それでは、スクリプトを実行してみましょう。

$ examine_exit.sh 6
$ echo $?
6
$ examine_exit.sh
$ echo $?
2

スクリプトの最初の実行では、6の終了ステータスで終了しました。 2回目の実行では、引数なしで、スクリプトは 2の終了ステータスで終了しました。は、exit。の前のlsコマンドの終了ステータスです。

foo()関数呼び出し内でスクリプトをすぐに終了したため、両方の実行でechoコマンドからの出力はありませんでした。

3.2. Bash関数の外部でexitを使用する

また、Bash関数の外部でexitを使用してスクリプトを終了できることも示しましょう。 次のスクリプトexamine_exit_anywhere.shがあります。

#!/bin/bash
echo “This line will be printed”
exit 0
echo “But this line will not be printed”

foo()
{
  if [ ! –z “$1” ]
  then
    exit $1
  fi

  ls /non_existing_file >& /dev/null
  exit
}

if [ ! –z “$1” ]
then
  foo $1
else
  foo
fi

echo “This line will not be printed”

このスクリプトは、以前に使用したスクリプトExamine_exit.shと非常によく似ています。 2つのechoコマンドをスクリプトの先頭に追加し、その間に exit0コマンドを追加しました。

スクリプトを実行してみましょう:

$ examine_exit_anywhere.sh
This line will be printed
$ echo $?
0

ご覧のとおり、最初のエコーが実行されました。 echoの後のexit0 により、スクリプトは終了ステータス0で終了しました。 スクリプトの残りのコマンドは実行されませんでした。

4. trapコマンドをexitで使用する

exitreturnのもう1つの違いは、trapコマンドに関連しています。 通常、トラップを使用して信号を処理しますが、トラップする信号としてEXITを指定すると、スクリプトがexitで終了したときにトラップに割り当てられたアクションが実行されます。

次のスクリプトexamine_trap.shでこれを明確にしましょう。

#!/bin/bash
trapecho This line will be printed at exit” EXIT

foo()
{
  echo “I am inside the foo functionreturn 0
}

foo

echo “I am outside the foo functionexit 0

スクリプトの先頭にあるtrapは、echoコマンドを呼び出すだけです。 foo()関数は、メッセージを出力し、returnを使用して戻ります。 最後に、別のメッセージを出力した後、 exitを使用してスクリプトを終了します。

スクリプトを実行してみましょう:

$ examine_trap.sh
I am inside the foo function
I am outside the foo function
This line will be printed at exit

ご覧のとおり、exitの前にreturnを呼び出しましたが、trapのメッセージはexitの後に出力されました。 したがって、シェルはEXITでトラップを実行して終了しますが、returnでは実行しません。

5. 結論

この記事では、returnコマンドとexitコマンドの違いについて説明しました。

関数内または関数外のいずれかで、スクリプト内の任意の場所でexitを呼び出すことができます。これにより、スクリプトの実行がすぐに停止します。

関数でreturnを呼び出すことができます。これにより、関数の実行がすぐに停止します。 スクリプトを終了するためにreturnを使用すると、エラーが発生します。 ただし、スクリプトを入手してもエラーは発生しません。

シェルは、exitのEXITでtrapコマンドのアクションを実行しますが、returnのアクションは実行しません。