問題の説明
Bash で実行したスクリプトで、関数内で getopts を実行したが思ったように動かない。
これが起きるのは、例えば、スクリプトの引数を解釈する部分を関数に切り出したい場合:
動かない.sh
parse() {
while getopts "abc" OPT
do
処理...
done
}
parse
これは思ったように動かない。
原因
getopts はデフォルトで $@ もしくは $1, $2, ... に相当するものを引数リストとみなして解析する。
これは関数内では 関数の引数 であって、スクリプトの引数ではない ので、期待通りに動かないのであった。
解決方法
-
【方法1】
getoptsは第3引数以降に引数リストを指定することができて、その場合は指定した引数リストが解析される。なので、スクリプトのトップレベルで、スクリプトの引数を変数に入れ、それを getopts で指定すればよい:方法1.shparse() { while getopts "abc" OPT argv; do 処理... done } argv=$@ # 配列変数 argv にスクリプト引数のリストを代入 parseただし変数スコープ的に気に入らない人もいると思う。その場合は次の方法をとる。
-
【方法2】トップレベルの
$@を関数の引数として渡す。この場合、関数に独自の引数を設定することはできないと思う:方法2.shparse() { while getopts "abc" OPT; do 処理... done } parse $@
さいごに
シェルあまり詳しくないので、間違いや改善点がありましたら教えて下さい。