関数・サブルーチン
システム管理者 Unixパワーユーザのためのコマンドリファレンス

[ Linux / Unix リファレンスガイド ] ⇒ [ シェルスクリプト ] ⇒ [ 関数・サブルーチン ]


関数・サブルーチン

何度も繰り返す処理を手続きとして関数やサブルーチンとして定義しておくで、メンテナンス性や可読性が向上する。戻り値を返すものを関数、そうでないものをサブルーチンと呼ぶがシェルスクリプトではあまり厳密には区別しなくても良い。

■基本的な書式(ファンクション・関数)
関数名(){
    処理・手続きを記述
    return 戻り値     ###(※returnと戻り値はなくても良い)
}


■基本的な書式(サブルーチン)
関数名(){
    処理・手続きを記述
}



何度も繰り返される処理は、処理を変更する際は該当する関数・サブルーチン一つを変更すれば良いので、カスタマイズが楽になる。

■80人分の 学生用アカウントを作成し、ホームディレクトリに .bashrc と .vimrc をコピーする冗長スクリプトの例

#!/bin/sh
useradd -d /home/std1001
cp /var/template/.bashrc /home/std1001/
cp /var/template/.vimrc /home/std1001/

useradd -d /home/std1002
cp /var/template/.bashrc /home/std1002/
cp /var/template/.vimrc /home/std1002/

useradd -d /home/std1003
cp /var/template/.bashrc /home/std1003/
cp /var/template/.vimrc /home/std1003/

useradd -d /home/std1004
cp /var/template/.bashrc /home/std1004/
cp /var/template/.vimrc /home/std1004/

(省略)

useradd -d /home/std1080
cp /var/template/.bashrc /home/std1080/
cp /var/template/.vimrc /home/std1080
/

■関数を使用して処理を定義した場合
#!/bin/sh

add_account()
{
     sch=$1
     useradd -d /home/$sch
     cp /var/template/.bashrc /home/$sch/
     cp /var/template/.vimrc /home/$sch/
}

stdid=1001
do
     while [ stdid -le 1080 ]
     add_account $stdid
     stdid=`expr $stdid + 1`
done

上記の場合は bashが他のシェルに、vimが他のテキストエディタに変更となった場合でも関数内の処理を更新すれば良いだけなので、作業を簡単に手早く終えることができる。本事例では return による戻り値の応答は行っていないが、処理を厳密に検査して正常終了した場合に0を、異常終了した場合は0以外を応答するなどの工夫を入れるとなお良いが、サンプルが複雑になるので、ここでは省略した。

上記の例以外として、長いプログラムを処理内容別に分かりやすい名称で名づけたサブルーチンにまとめることで、どの部分でどのような処理が行われているのかが分かりやすく上、メインプログラムがすっきりとするメリットがある。