シェルスクリプトの基礎 - 関数

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要



関数の基本

関数の定義

以下のいずれかの構文を利用して、関数を定義することができる。

 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