関数に引数を渡すには「$1」、「$2」といった名前の特殊な変数を用いる。すべての入力引数は「$@」という配列に格納される。ただし、「$1」、「$2」といった変数は、関数の引数の個数が決まっている場合にのみ利用すること。呼び出すたびに引数の数が変わりうる場合は、次のような関数を利用して配列「$@」から引数を1つずつ取り出して処理する。
| bashのドキュメント |
|---|
| bash関連の資料としては、「Bash Reference Manual」と「Advanced Bash Scripting Guide」が参考になる。 |
function partition_maintenance {
for partition in $@
do
#do something to the current partition
done
}
また、どの関数でも、動作の診断に役立つように終了コードを返すようにする。そのためには、次のようにreturnキーワードを用いる。
function check_treshold {
if [ $SOME_VAR -gt 40 ] ; then echo 5; return 5; else echo 4; return 4 ; fi
}
SOME_VARの値が40以下の場合、この関数の戻り値は4となる。ただし、戻り値には数値しか使えないことに注意が必要であり、文字列や配列を返すには結果をechoで出力するか、次のようにバッククォートで囲んで代入を行う。
IS_SOME_VAR_LESS_THAN_40=`check_treshold`
あるいは、その変数の参照を関数に渡してもよい。その場合はevalステートメントを使って次のように記述する。
function set_variable {
eval "$1=$2"
}
この例では、「set_variable WEBSITE linux.com」というコマンドによって(変数名の前にドル記号がないことに注意)、$WEBSITEに「linux.com」が代入される。
シェル関数を使って作業を効率化するには、シェル関数を使うべきでない状況についても知っておく必要がある。以下の簡単なシェルスクリプトは、関数を使わずに計算を行う3つの方法と、実際には計算が行われない1つの例を示している。
#! /bin/bash MY_VAR=40 echo 0: $MY_VAR MY_VAR=`expr $MY_VAR - 10` echo 1: $MY_VAR MY_VAR=$(($MY_VAR + (5**2 /2))) echo 2: $MY_VAR let MY_VAR="$MY_VAR + 7" echo 3: $MY_VAR MY_VAR="$MY_VAR + 7" # this is a string assignment, not a calculation echo 4: $MY_VAR
次の出力結果から、関数は確かにすばらしいものだが、簡単な算術演算であれば関数を使わなくても十分に間に合うことがわかるだろう。
0: 40 1: 30 2: 42 3: 49 4: 49 + 7
Marco Fiorettiは「The Family Guide to Digital Freedom」の著者。普段はLinux.comをはじめとするIT関連誌に寄稿している。
