関数の定義
# 関数を定義
func() {
echo 'func body'
}
# 関数の利用
func
function ~ 関数の定義
# function で関数を定義
function func() {
echo 'func body'
}
# 関数の利用
func
function で定義する場合はカッコはあってもなくても定義することができます。
# function で関数を定義
# 関数名のあとのカッコはなくても良い
function func {
echo 'func body'
}
# 関数の利用
func
関数の引数
func() {
echo "引数の数: ${#*}"
echo "引数の数: ${#@}"
echo "1つ目の引数: $1"
echo "2つ目の引数: $2"
echo "3つ目の引数: $3"
echo "すべての引数: ${*}"
echo "すべての引数(配列): ${@}"
}
func 1 2 3
関数と変数
func() {
# local で宣言した変数は関数の中でのみ使用できる
local var2=2
# var3 は local で宣言していないので関数の外でも使用できる
var3=3
# declare で宣言した変数は関数の中でのみ使用できる
declare -i var4=4
echo "var1=${var1}"
echo "var2=${var2}"
echo "var3=${var3}"
echo "var4=${var4}"
}
# 関数の外で宣言した変数は関数の中でも利用できる
var1=1
func
echo '------------------------------'
echo "var1=${var1}"
echo "var2=${var2}"
echo "var3=${var3}"
echo "var4=${var4}"
return 関数を途中で終了する
関数を途中で中断し呼び出し元にステータスを戻すには return を使用します。
func() {
echo ' func return before'
return 0
echo ' func return after'
}
echo "func before"
func
echo "func after status=$?"
return の引数に指定したステータスが呼び出し元に返されます。
func() {
if [[ $1 == "OK" ]]; then
echo "> OK"
return 0
fi
echo "> NG: \$1 is $1"
return 1
}
echo '1. ------------------------------'
func OK
echo "status=$?"
echo '2. ------------------------------'
func NG
echo "status=$?"
ステータスを指定せずに return を使用した場合は最後のコマンドのステータスが使用されます。
func() {
test "${1}" == 'OK'
return
}
echo '1. ------------------------------'
func OK
echo "status=$?"
echo '2. ------------------------------'
func NG
echo "status=$?"
関数での trap RETURN
RETURN シグナルに trap を設定することで関数の終了時に処理を行うことができます。
func() {
echo 'func start'
trap 'echo "func trap"' RETURN
echo 'func end'
}
func
func() {
echo 'func start'
trap 'echo "func trap"' RETURN
if [[ $1 == '1' ]]; then
return 1
fi
echo 'func end'
return 0
}
echo '1. ------------------------------'
func 1
echo '2. ------------------------------'
func 2
# func2 関数内の trap は func1 関数内の trap で上書きされる
# 結果として func2 関数の終了時にも func1 trap が出力される
func1() {
echo "${1}func1 start"
# RETURN シグナルに対する trap が上書きされる
trap 'echo "${1}func1 trap"' RETURN
echo "${1}func1 end"
}
func2() {
echo 'func2 start'
trap 'echo "func2 trap"' RETURN
func1 ' '
echo 'func2 end'
}
func2
上書きした trap の処理の終了時に RETURN シグナルに対する trap をリセットすることで想定した動きになります。
func1() {
echo "${1}func1 start"
# trap の処理終了時に RETURN シグナルに対する trap をリセット
trap 'echo "${1}func1 trap"; trap - RETURN' RETURN
echo "${1}func1 end"
}
func2() {
echo 'func2 start'
trap 'echo "func2 trap"' RETURN
func1 ' '
echo 'func2 end'
}
func2