シェルスクリプトの基礎 - 関数
概要
関数の基本
関数の定義
以下のいずれかの構文を利用して、関数を定義することができる。
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