Geek-Side

Resource > args

シェルスクリプトや関数は引数を受け取ることができます。

引数にまつわる変数


シェルスクリプトや関数に渡された引数は、特別な変数で参照することができます。
また、渡された引数の数も特別な変数に格納されます。

変数 内容
$# 引数の数
$n n番目の引数
$@ 全ての引数

$#変数を用いて引数の数をチェックする例です。
return_arg_count() {
    if [ $# -eq 1 ]; then
        echo 引数の数は1です;
    else
        echo 引数の数は1ではありません;
    fi
}

一番目の引数は$1に、2番目の引数は$2に格納されています。
なお、$0はシェルスクリプトのファイル名が格納されています。

getopts関数を利用した引数の処理


getopts関数を用いれば、関数やシェルスクリプトに与えられたオプションやオプション引数ををうまく処理することができます。

getoptsは下記の形式で利用します。
getopts オプション 変数

オプションには、使用するオプションを指定します。
オプションは1文字で、オプションの後に:(コロン)を指定していた場合は、オプション引数を必須としていることを表します。
変数には指定されたオプションが格納されます。オプション引数はOPTARG変数に格納されます。

下記の例では、関数のオプションはeとaを受け取ります。eオプションを指定していた場合は、オプション引数が必須となります。
なお、必須のオプション引数が指定されなかった場合の挙動は、OPTERR変数の値によります。

OPTERR = 0 エラーメッセージを表示しない
OPTERR != 0 エラーメッセージを表示

return_getopts() {
    getopts e:a OPT
    echo $OPT:$OPTARG
}

# -eオプションには引数が必須になります
testGetopts() {
    result=`return_getopts -e foo -a`
    assertEquals \
    	"e:foo" "${result}"  
}

getopts関数は1度に1つのオプションしか処理できません。オプションが複数ある場合は、繰り返しgetopts関数を呼ぶ必要があります。
通常は下記のようにwhileループで複数のオプションを処理します。
getopts_require_arg() {

    while getopts e:s: OPT
    do	      
	case $OPT in
	    "e" ) EXTENTION="$OPTARG" ;;
	    "s" ) SEARCH_DIR="$OPTARG" ;;
	    \?  ) echo "使い方..."
                  exit 1 ;;
	esac
    done
    echo ${EXTENTION}:${SEARCH_DIR}
}

getopts関数は最後のオプションを処理を終えた後に呼ばれると、1以上の値を返すためwhileループを抜ける事になります。
また、必須のオプション引数が指定されていなかった場合は、OPT変数に?が格納されるため、case文で関数を抜けるように記述しています。