問題の説明
Bash で実行したスクリプトで、関数内で getopts
を実行したが思ったように動かない。
原因
getopts
はデフォルトで $@
に相当するものを引数リストとみなして解析する。
関数内ではこれは 関数の引数であって、スクリプトの引数ではないので、期待通りに動かないのであった。
解決方法
- スクリプトのトップレベルで、スクリプトの引数を変数に入れ、それを getopts で指定する
トップレベル.sh
parse(){while getopts"abc" OPT argv;do
処理...
done}argv=$@
parse
- トップレベルの
$@
を持ち回る。この場合、関数に独自の引数を設定することはできないと思う
トップレベル.sh
parse(){while getopts"abc" OPT;do
処理...
done}
parse $@
さいごに
シェルあまり詳しくないので、間違いや改善点がありましたら教えて下さい。