シェルスクリプトの基礎 - 関数
概要
関数の基本
関数の定義
以下のいずれかの構文を利用して、関数を定義することができる。
 function funcname
 {
    <shell commands...>
 }
 
 または
 
 function funcname()
 {
    <shell commands...>
 }
関数の削除
定義されている関数を削除するには、以下のコマンドを実行する。
unset -f funcname
現在のログインセッションにおいて、どのような関数が定義されているかを確認するには、以下のコマンドを実行する。
declare -F # 関数名のみ出力 declare -f # 関数の定義も出力
関数と環境変数
シェルスクリプトの関数は、実行したシェルと同じプロセスで実行される。
したがって、以下のように、関数内で環境変数を設定した場合、関数を呼び出したシェルにも反映される。
 function myfunc()
 {
    export AAA=100
 }
関数の定義の注意点
関数の内容が無い場合、シンタックスエラーが出力される。
 myfunc()
 {
 
 }
 
 # 出力
 ./Sample.sh: 行 3: 予期しないトークン `}' 周辺に構文エラーがあります
 ./Sample.sh: 行 3: `}'
関数にパラメータを渡す
関数に渡されたパラメータの処理方法は、シェルスクリプト実行時に渡されたコマンドラインパラメータの処理方法と同じである。
関数へ渡されたパラメータの数を調べる($#)
関数内で$#を参照する場合、渡されたパラメータの数を調べることができる。
また、関数の外で$#を参照する場合、シェルスクリプト実行時に渡されたコマンドラインパラメータの数を取得できる。
 function SampleFunc()
 {
    echo $#
 }
 
 # 出力
 SampleFunc 100 200
 2
 
 SampleFunc aaa bbb ccc
 3
 SampleFunc "This is a pen"
 1
以下の例では、関数へ渡されたパラメータが少なくとも1つ以上あるか確認している。
 function SampleFunc()
 {
    if [ $# -lt 1 ]; then
       echo 'Function "foo" needs at least one parameter' >&2
       exit -1
    fi
    echo 'OK'
 }
以下の例では、shiftコマンドを使用して、関数へ渡されたパラメータを順番に処理している。
 function SampleFunc()
 {
    while [ -n "$1" ]
    do
       echo $1
       shift
    done
 }
 
 # 出力
 SampleFunc 1 2 3
 1
 2
 3
また、パラメータをシングルクォーテーションあるいはダブルクォーテーションで括ると、1つのパラメータとして処理される。
# 出力 SampleFunc "1 2 3" 1 2 3
関数のデフォルトパラメータの定義
パラメータの参照において、${1:-デフォルト値}という形で参照すると、
1つ目のパラメータが指定されなかった場合、デフォルト値を使用することができる。
(これは、シェルスクリプトのコマンドラインパラメータの扱いと同様である)
 function SampleFunc()
 {
    name=${1:-everyone}
    echo "Hello $name"
 }
 
 # 出力
 SampleFunc
 Hello everyone
 
 SampleFunc Maku
 Hello Maku
関数のローカル変数
シェルスクリプトは、関数の内部と関数の外部で変数を共有する。
以下のように、関数内で代入を行う場合、関数外で代入した値が上書きされる。
 function SampleFunc()
 {
    A=200
 }
 
 # 出力
 A=100
 SampleFunc
 echo $A
 
 200  # 変数Aの値が上書きされる
関数の内部のみ有効な変数を宣言する場合、localキーワードを付加する。
 function SampleFunc()
 {
    local A=200
 }
 
 # 出力
 A=100
 SampleFunc
 echo $A
 
 100  # 変数Aの値は変化しない
以下の例では、ローカル変数にデフォルト引数を定義している。
 function SampleFunc()
 {
    local A=${1:-ABC};
    echo "param = $A"
 }
 
 # 出力
 SampleFunc
 param = ABC
 SampleFunc 10000
 param = 10000
関数の戻り値
関数の戻り値において、returnで返すことのできる値は数値(0~255)のみである。
returnで返された戻り値を参照する場合、$?を参照する。
 function SampleFunc()
 {
    return 1
 }
 
 # 出力
 SampleFunc
 echo $?
関数の実行結果を文字列として受け取る場合、関数の内部でechoした文字列をバッククォートを括った関数を実行して取得する。
 function SampleFunc
 {
    echo 'hoge'
 }
 
 # 出力
 val=`SampleFunc`  または  val=$(SampleFunc)
 echo $val
 
 hoge