私は、getopts
オプションと位置パラメーターを完全に組み合わせるために拡張できる方法を 1 つ考え出しました。アイデアは、、、 などにgetopts
見つかった位置パラメータの呼び出しと割り当てを交互に行うことです。n1
n2
n3
parse_args() {
_parse_args 1 "$@"
}
_parse_args() {
local n="$1"
shift
local options_func="$1"
shift
local OPTIND
"$options_func" "$@"
shift $(( OPTIND - 1 ))
if [ $# -gt 0 ]; then
eval test -n \${n$n+x}
if [ $? -eq 0 ]; then
eval n$n="\$1"
fi
shift
_parse_args $(( n + 1 )) "$options_func" "$@"
fi
}
次に、OPの場合、次のように使用できます。
main() {
local n1='' n2='' n3=''
local duration hostname script
parse_args parse_main_options "$@"
echo "n1 = $n1"
echo "n2 = $n2"
echo "n3 = $n3"
echo "duration = $duration"
echo "hostname = $hostname"
echo "script = $script"
}
parse_main_options() {
while getopts d:h:s: opt; do
case "$opt" in
d) duration="$OPTARG" ;;
h) hostname="$OPTARG" ;;
s) script="$OPTARG" ;;
esac
done
}
main "$@"
実行すると、次の出力が表示されます。
$ myshell.sh param1 param2 -h hostname param3 -d waittime -s test.sh
n1 = param1
n2 = param2
n3 = param3
duration = waittime
hostname = hostname
script = test.sh
単なる概念実証ですが、誰かにとって役立つかもしれません。
注:を使用する 1 つの関数が使用parse_args
する別の関数を呼び出しparse_args
、外側の関数が eg を宣言している場合、落とし穴がありますが、内側の関数はそうでlocal n4=''
はなく、 4 つ以上の位置パラメーターが内側の関数に渡されます。