関数(応用)

では、実際にどういう場面で関数を活用するのか実践してみましょう。
前々回、「引数処理」の説明をした際に作ったスクリプトを覚えていますか?

こんなスクリプトでした。

#!/bin/bash

## 引数処理サンプル

if [ "$1" = "" ] 
then
    echo "引数がありません"
    echo "USAGE : `basename $0` [-abcd]"
    exit 1
fi

while getopts ":abc:d" V_OPT
do
    case ${V_OPT} in
        a)
            echo "引数はaです"
            ;;
        b)
            echo "引数はbです"
            ;;
        c)
            echo "引数はcです"
            echo "引数に付加された文字は${OPTARG}です"
            ;;
        d)
            echo "引数はdです"
            ;;
        *)
            echo "想定していない引数です"
            echo "USAGE : `basename $0` [-abcd]"
            exit 1
            ;;
    esac
done

shift $(( ${OPTIND} -1 ))

if [ "$1" != "" ] 
then
    echo "$1は想定していない引数です"
    echo "USAGE : `basename $0` [-abcd]"
    exit 1
fi

exit 0

 

このスクリプトで、エラー判定をした際に、USAGEを出力する様になってますが、USAGEはコマンドの使い方を書いたもので、どんなエラーの時にも変わる事はありません。

にも関わらず、上記のスクリプトでは3回も同じ文字列を出力してますね。

「-d」オプションの使い方が変わったので、USAGEを書き直す旨を書いておきましたが、書き直すのに同じ事を3回繰り返さなければなりません。

こういう処理に関数を使用します。

 

では、早速関数を使用して書き直してみましょう。

関数化部分は、ここでは以下になります。

echo "USAGE : `basename $0` [-abcd]"

 

まず関数を作りましょう。

function F_Usage()
{
    echo "USAGE : `basename $0` [-abcd]"
    return 0
}

 

この関数をスクリプトの前部に配置し、処理の中でUSAGE出力していた部分で関数を呼び出します。

#!/bin/bash

## 引数処理サンプル2

## 関数定義

function F_Usage()
{
    echo "USAGE : `basename $0` [-abc][-d STRING]"
    return 0
}

if [ "$1" = "" ] 
then
    echo "引数がありません"
    F_Usage
    exit 1
fi

while getopts ":abc:d" V_OPT
do
    case ${V_OPT} in
        a)
            echo "引数はaです"
            ;;
        b)
            echo "引数はbです"
            ;;
        c)
            echo "引数はcです"
            echo "引数に付加された文字は${OPTARG}です"
            ;;
        d)
            echo "引数はdです"
            ;;
        *)
            echo "想定していない引数です"
            F_Usage
            exit 1
            ;;
    esac
done

shift $(( ${OPTIND} -1 ))

if [ "$1" != "" ] 
then
    echo "$1は想定していない引数です"
    F_Usage
    exit 1
fi

exit 0

 

これで、前々回作ったスクリプトと同等の処理をするスクリプトになりました。

ついでに前々回の課題であったUSAGEの内容を書き換えておきましょう。

もちろん関数化してるので、修正箇所は1箇所だけです。

 

ここで、「ん?」と気づいた方はするどいです。

エラー発生時にはUSAGE出力以外にも「exit」コマンド部分も共通して行ってますよね。

なぜここは関数化しないのか・・・・?

 

それは次回の「シグナルの処理」に続くからです。

次回の「シグナルの処理」でここから先は説明します。