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

シェル関数の定義と呼び出しの説明

2022-02-08 22:39:42

I. シェル関数の定義形式

シェル関数定義のフォーマットで、各セクションは以下のように記述されています。

関数 ]などの括弧で囲まれた部分。----はオプション(=任意)です。

your_function_nameの部分 ---- は関数名です。

your_shell_commandsセクション ---- は関数コードです。シェルは通常行単位ですが、1行の区切りとして" \" を使用することができます。

return int の部分 ---- シェル関数は戻り値を持つことができますが、文字列ではなく整数値のみを返すことができます。

[ function ] your_function_name()
{
  your_shell_commands;
  [return int;]
}

II. 基本的な関数の定義と呼び出し

本節のプログラムは、関数の定義と呼び出しを実装したものです。なお、関数の呼び出しは、括弧を使わずに(つまり、testFun()のようにするのは正しくない)、次のようなコードで行います。

testFun{
  echo "helloworld!"
}

testFun

以下のように実行されます。

III. 呼び出しにパラメータを渡す

3.1 パラメータを空白なしで渡す

このセクションのプログラムでは、呼び出された関数に引数を渡すことを実装しています。0はスクリプトを実行しているシェルから渡される引数で、$1から始まり、複数の引数がスペースで区切られて渡され、次のようなコードになります。

testFun(){
  echo $1
}

param="helloworld!"
testFun $param

以下のように実行されます。

n番目のパラメータを$nの形で取得する以外に、いくつかの書き方があります。

<テーブル フォーム 説明 $# スクリプトに渡されたパラメータの数 $* スクリプトに渡されたすべてのパラメータを1つの文字列として表示します。 $$ 現在実行中のスクリプトのプロセスID番号 $! バックグラウンドで最後に動作したプロセスのID番号 $@ $* と同じですが、引用符で囲んで使用し、各引数を引用符で囲んで返します。 $- シェルが現在使用しているオプションを表示します。setコマンドと同じ機能です。 $? 最後のコマンドの終了ステータスを表示します。0はエラーなし、それ以外はエラーを表します。

3.2 空白を含むパラメータの受け渡し

本節のプログラムでは、呼び出された関数にスペースを入れて引数を渡すことを実装しているので、前節の "helloworld!" を "hello world!" にスペースを入れて次のように変更します。

testFun(){
  echo $1
}

param="hello world!"
testFun $param

以下のように実行されます。

スペースの前の "hello" だけが印刷され、スペースの後の "world!" は印刷されないことがわかります(実際、スペースの後の "world!" は $2 として認識されています)。

スペースを含むパラメータを渡すには、次のようなコードで、二重引用符で囲んで渡すだけです(一重引用符は変数とみなされないので、使えません)。

testFun(){
  echo $1
}

param="hello world!"
testFun "$param"

以下のように実行されます。

IV. 戻り値の取得

4.1 整数を返す

testFun(){
  echo "helloworld!"
  return 99
}


# It is important to note that the shell does not return the value directly like other languages, the return value is put into $? which is the reason why it can only return integers
# So this is the wrong way to proceed, the value you get is what echo prints
# return_value=`testFun`
# The following is the correct way to get the return value returned by return
testFun
echo "the return value is: $? "

4.2 文字列を返す

シェル関数は整数値しか返せず、文字列は返せないことを先に述べましたが、次のコードで無理やり文字列を返してみましょう。

testFun(){
  echo "helloworld!"
  return "success"
}

testFun

以下を実行すると、returnのところで "-bash: return: success: numeric argument required" というエラーが表示されるのがわかります。

そこで、returnで文字列を返すのは問題外として、2つの回避策があります。1つ目は、次のコードで$()を介して関数のすべてのプリントを取得することです。

testFun(){
  echo "helloworld!"
  echo "success"
}

return_value=$(testFun)
echo "$return_value"

以下のように実行されます。

成功」が得られていることがわかります。しかし、この方法は呼び出された関数のすべての出力を取得するので、戻り値を取得するために個別に解析する必要があることもわかります。

もう一つの方法は、変数を直接使うことです。シェル変数は、呼び出された関数で代入され、呼び出し側の関数でも利用できるグローバル変数で、次のようなコードになります。

testFun(){
  echo "helloworld!"
  return_value="success"
}

testFun
echo $return_value

以下のように実行されます。

参考までに。

http://edu.jb51.net/linux/linux-shell-passing-arguments.html

上記はシェル関数の定義と呼び出しの詳細な説明です。シェル関数の定義と呼び出しの詳細については、スクリプトハウスの他の関連記事に注目してください!