シェルスクリプトの関数
シェルスクリプトの関数定義
関数の定義
シェルスクリプトの関数定義は以下の形式となります。
関数名の後に「( )」を付けます。
function 関数名() {
処理
return 値
}
なお、頭につける「function」は省略可能であり、一般的には以下のような書式で関数を定義します。
hello_world() {
# メッセージを標準出力とログファイルに出力する。
echo "hello world." | tee -a ./test.log
return 0
}
シェルスクリプトにおける関数の戻り値
数値の戻り値(終了コード)
関数の末尾に「return」コマンドを記述すると、関数の終了ステータスを数値として返すことができます。
returnコマンドの引数に指定できる値は、「1~255の正の整数のみ」です。マイナス値の指定も可能ですが、「-1」を指定した場合は結果的に255になります。
returnコマンドは省略可能です。省略された場合は、関数内で最後に実行されたコマンドの終了ステータスが、関数自体の終了ステータスとなります。
delete_config_file() {
rm ./conf/camp-network.conf
if [ $? -gt 0 ]; then
echo "ERROR: invalid argument."
return 1
fi
return 0
}
文字列などの戻り値
returnコマンドでは、文字列などを戻り値として返すことはできません。
戻り値を使用したい場合は、関数内で標準出力に戻り値を出力し、コマンド置換でその値を取得する方法があります。
hello_world() {
echo "hello world."
}
msg=`hello_world`
echo "戻り値=${msg}"
シェルスクリプトにおける関数の呼び出し
関数の呼び出し
シェルスクリプトの関数呼び出しは以下の形式となります。
呼び出し時は「( )」は不要です。
関数名 引数リスト
関数の引数
関数は引数を持つことが可能で、関数内ではシェルスクリプトと同様に変数「$1 ~ $n」で各引数を参照することが可能です。
C言語のように括弧の中に引数を記述する必要はありません。
関数に引数を渡す場合は、シェルと同じようにスペース区切りで渡します。
#!/bin/sh
func_sample()
{
#引数が存在しているか確認する
if [ $# != 2 ]; then
echo "ERROR: Too few arguments." 1>&2
return 1
fi
# 引数を出力する
echo "\$0=$0"
echo "\$1=$1"
echo "\$2=$2"
return 0
}
func_sample 123 456
ret=$?
echo "result=${ret}"
引数を表す特殊な変数は以下の通りです。
$# | 関数に与えられた引数の個数 |
$0 | シェル自身のファイル名(関数名ではないので注意が必要です。) |
$1~$n | シェルに与えられた引数の値。$1は第1引数、$2は第2引数…となる。 |
$* | 全引数リスト。"$*"のように「"」で囲んだ場合、"$1 $2 … $n" と全引数を一つにくっついた形で展開される。 |
$@ | 全引数リスト。"$@"のように「"」で囲んだ場合、"$1" "$2" … "$n" とそれぞれの引数を個別にダブルクォートで囲んで展開される。 |
$? | 最後に実行したコマンドの終了コード(戻り値) |
シェルスクリプト関数の変数スコープ
シェルスクリプトのグローバル変数
シェルスクリプトでは、関数内で宣言した変数はグローバル変数となります。
ローカル変数ではありませんので、関数外から参照することが可能です。
#!/bin/sh
set_logfile_path() {
logfile_path="./log_`date +%Y%m%d`-`date +%H%M`.log"
}
set_logfile_path
echo "[LOG] log point: 1" | tee -a ${logfile_path}
シェルスクリプトのローカル変数
シェルスクリプトでローカル変数を用いる場合には、変数に「local」キーワードを指定します。
func_sample() {
local local_var="ローカル変数です"
global_var="グローバル定数です"
}
シェルスクリプトの定数
シェルスクリプトで定数を用いる場合には、変数に「readonly」キーワードを指定します。「readonly」を付けると以降値の書き換えを出来なくなります。
func_sample() {
readonly local_var="読み込み専用のグローバル変数です"
local readonly LOCAL_VAR="読み込み専用のローカル定数です"
}
その他の変数定義方法
明示的に変数を宣言する事場合、下記のコマンドがあります。
ほぼ同機能であるため、「declare」コマンドのほうが利用頻度は高いといえます。
declare [オプション] [変数名[=値]]
typeset [オプション] [変数名[=値]]
-a | 変数を配列として作成します。 |
-i | 変数を整数型(integer)として作成します。 |
-r | 変数を参照のみ可能(read only)として作成します。readonlyコマンドと同じ |
-f | 定義済関数を表示します。 |
-F | 定義済関数名を表示します。 |
シェルスクリプト変数の開放
変数の開放には「unset」コマンドを使用します。
unset var