Shell 関数

Linux Shell ではユーザーが関数を定義でき、シェルスクリプト内で自由に呼び出すことができます。

シェルにおける関数の定義形式は以下のとおりです:

[ function ] funname [()]

{

    action;

    [return int;]

}

説明:

  • 1、〜を付けてfunction fun()定義することも、直接fun()定義することもできます。パラメータは不要です。
  • 2、パラメータの戻り値は、明示的に加えることができます:return返り値。もし加えない場合、最後に実行されたコマンドの実行結果が戻り値となります。returnの後に数値が続きますn(0-255).

以下の例では関数を定義して呼び出しています:

実例

#!/bin/bash
# author:サンプル
# url:www.example.com

demoFun(){
    echo "これは私の最初のシェル関数です!"
}
echo "-----関数の実行を開始-----"
demoFun
echo -----関数の実行が完了しました-----

出力結果:

-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----

以下は、returnreturn 文を含む関数を定義します:

実例

#!/bin/bash
# author:サンプル
# url:www.example.com

funWithReturn(){
    echo "この関数は入力された2つの数字を加算します..."
    echo "最初の数字を入力してください: "
    read aNum
    echo "2番目の数字を入力してください: "
    read anotherNum
    echo "2つの数字はそれぞれ$aNumと$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "入力された2つの数字の合計は $? です!"

出力は以下のようになります:

这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 !

関数の戻り値は、その関数を呼び出した後に$? によって取得されます。

注意:すべての関数は使用する前に定義する必要があります。つまり、関数をスクリプトの先頭部分に置き、シェルインタプリタが最初にそれを発見してから使用できるようにしなければなりません。関数を呼び出すときは、関数名を使用するだけで構いません。

注意: returnreturn 文は 0 から 255 の間の整数のみを返すことができますが、2つの入力数字の和はこの範囲を超える可能性があります。

この問題を解決するには、return 文を修正し、return を使用せずに echo で直接和を出力することができます:

実例

funWithReturn(){
    echo "この関数は入力された2つの数字を加算します..."
    echo "最初の数字を入力してください: "
    read aNum
    echo "2番目の数字を入力してください: "
    read anotherNum
    sum=$(($aNum + $anotherNum))
    echo "2つの数字はそれぞれ$aNumと$anotherNum !"
    echo $sum  # 2つの数字の和を出力する
}

関数パラメータ

シェルでは、関数を呼び出すときにパラメータを渡すことができます。関数本体内では、$n の形式でパラメータの値を取得できます。例えば、$1 は最初のパラメータ、$2 は2番目のパラメータを表します...

パラメータ付き関数の例:

実例

#!/bin/bash
# author:サンプル
# url:www.example.com

funWithParam(){
    echo "最初のパラメータは $1 です!"
    echo "2番目のパラメータは $2 です!"
    echo "10番目のパラメータは $10 です!"
    echo "10番目のパラメータは${10} !"
    echo "11番目のパラメータは${11} !"
    echo "パラメータの総数は $# 個です!"
    echo "すべてのパラメータを1つの文字列として出力 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

出力結果:

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

注意:$10 では10番目のパラメータを取得できません。10番目のパラメータを取得するには ${10} が必要です。n>=10 の場合、パラメータを取得するには ${n} を使用する必要があります。

その他にも、パラメータを処理するための特殊文字がいくつかあります:

パラメータ処理 説明
$# スクリプトまたは関数に渡されるパラメータの数
$* スクリプトに渡されたすべてのパラメータを単一の文字列として表示
$$ スクリプトを実行中の現在のプロセスID番号
$! バックグラウンドで実行されている最後のプロセスのID番号
$@ $* と同じですが、使用時に引用符を付け、引用符の中で各パラメータを返します。
$- シェルが使用する現在のオプションを表示します。set コマンドと同じ機能です。
$? 最後のコマンドの終了ステータスを表示します。0 はエラーがないことを示し、他の値はエラーがあることを示します。
その他の拡張