How to use ShellScript file arguments in user defined function
シェルスクリプトで,ユーザー関数でスクリプトファイルの引数を使う方法がわかったのでメモしておく。端的に結論を書くと,ユーザー関数の引数に$@を渡せばよい。
シェルスクリプトの引数はスクリプトでよく使われるパラメーターだろう。例えば,シェルスクリプトに渡す引数の既定値を設定したり,引数の数や内容を確認して,ユーザーに問い合わせるような処理に使われるだろう。
こうしたスクリプトファイルの引数を使った定型処理をユーザー関数にして,他で使いまわしたり管理しやすくしたい。
スクリプトファイルの引数は,位置パラメーターである$$1,$2,…,$nや$@,$*などで参照できる。しかし,シェルスクリプトのユーザー関数内ではこれらの位置パラメーターはユーザー関数の引数として解釈されてしまう。そのため,引数が何個渡されるかわからないときに対応しにくい。
一応,以下のようにスクリプトファイルの引数をユーザー関数の引数に渡して実行することは可能だ。
echo << EOF > arg_parse.sh
#!/bin/bash
## \file arg_parse.sh
arg_parse(){
[ "$#" -gt 4 ] && echo "arguments $# is too much!" && return 1
echo $1 $2 $3
return
}
arg_parse $1 $2 $3 $4
EOF
./arg_parse.sh one two three four
arguments 4 is too much!
しかし,これだと引数の個数を決め打ちで指定する必要があり,引数の個数が何個くるかわからないときの処理が難しく,見た感じもよくない。
この解決策としては,ユーザー関数の引数に$@を渡せばよい。
echo << EOF > arg_parse.sh
#!/bin/bash
## \file arg_parse.sh
arg_parse(){
[ "$#" -gt 4 ] && echo "arguments $# is too much!" && return 1
echo $1 $2 $3
return
}
arg_parse "$@" # <- here
EOF
./arg_parse.sh one two three four
arguments 4 is too much!
$@は,スクリプトファイルに渡された全ての引数が代入されている。ユーザー関数の引数にスクリプトファイルの全ての引数を渡すことで,スクリプトファイルの引数が何個であろうともユーザー関数で取り扱うことができる。
$@と類似のパラメーターとして,$*がある。こちらも全ての引数が格納されている。こちらは$@とは異なり各引数の区切り文字がIFS変数となっている。$*はIFS変数と併用して引数をカンマ区切りにしたり加工するのに便利だが,通常の利用であれば$@で十分だろう。
これで,スクリプトファイルの引数が何個であろうと,ユーザー関数でもスクリプトファイルの引数を処理できるようになった。今後はシェルスクリプトでのスクリプトファイルの引数はユーザー関数で処理してやろう。