シェル・プログラミング:13. 関数
同じ処理を何度となくさせる場合,その処理を「一つの関数」として設定し,スクリプト内でそれを呼び出せばその処理がいつでもできる方が,プログラムとしては簡明になります。この考え方を拡張すれば,1つ1つの小さな,しかし結果に意味・目的を持たせるような処理を「1つの関数」として設定し,関数の羅列でプログラムを組めば,プログラムは,飛躍的に見やすくなることでしょう。ここでは,先ず,数学の関数の考え方を復習し,その後,それをシェル・スクリプトでの関数の設定方法と呼び出し方を見ます。
13.1. 数学の関数
変数 x にある値を代入すると,変数 y がある一定のルールの下にある値をとるとき,変数 y は変数 x の関数といい,その依存関係を y=f(x) などで表記し,変数 x を関数 f の独立変数,変数 y を従属変数と呼ぶのでした。独立変数 x はベクトルでもよいし,変数 y もベクトルかもしれません。関数の値(y の値)が,変数 x の任意の値に対し一定の場合,これも関数であり,「定値関数」と呼ばれるのも習ったことでしょう。通例,x の値が変われば,「一定のルール」に従い,y の値は変化します。
- 例:大小大きい方を出す関数
f(x1, x2) = max{x1, x2}
例えば,x1 = 1, x2 = 2 ならば,f(x1, x2) = 2.
13.2. シェルでの関数
上の「一定のルール」を「定めた処理」と置き換えてみましょう。然らば,プログラミングにおける関数は,「予め処理を定める」ことで,関数に渡された値(入力)がその処理に従い,他の値(出力)に変換される仕組みということになります。シェルでの関数の定義方法,およびスクリプト内での変数の代入方法は,以下の通りです。
- 関数の定義
■関数の定義 関数名 () { 処理 }
但し,関数は,それを呼び出す前に定義されていなければなりません。
- 関数の独立変数と呼出し方法
関数は,スクリプト内の変数を独立変数に持てます。しかし,特定の値を関数に代入したい場合,スクリプト内で次のように関数を呼び出せば良いです。
■関数の呼出し 関数名 値1 値2 ...
関数内では,値
x
を$x
($1,...,$9, または $*
) で参照できます。もちろん,$#
も使えます。 - 関数の従属変数
関数内で処理された結果(変数の値)は,すべてスクリプト内で参照できます。すなわち,関数内のすべての変数値が数学でいう従属変数です。しかし,次のようにすれば,ある特定の値のみを関数の値とすることができます。
関数名 () { 処理 return 従属変数 }
# # 例 18 # #!/bin/sh ### Function: f_max ### f_max () { if [ max -lt $1 ] then max=$1 fi } ### MAIN ### echo '# Example 18' num=$* if [ -z $num ] then echo -n 'Enter your favorite integers: ' read num fi set $num max=$1 shift while [ $# -gt 0 ] do f_max $1 shift done echo "Maximum: $max"
実行例) % sh script # Example 18 Enter your favorite integers: 1 85 47 2 5 9 56 32 24 11 93 Maximum: 93 %