例如,在
python::click
中,我可能会声明一个选项:
@click.option('--foo', nargs=-1)
用户可以一遍又一遍地指定参数:
python3 -m mypkg --foo bar --foo biz
或者在 BASH 中:
declare -a a_arr;
while getopts 'a:' opt; do
case $opt in:
a) a_arr+=($OPTARG);;
esac
done
shift (($OPTIND - 1))
但是在 TCL 中,要解析命令行,我发现我必须运行:
array set params [::cmdline::getoptions argv $options $usage]
这没有 BASH 的表面积,无论如何我都可以让它工作,而且我没有看到文档表明有一个
nargs
选项可用,可以在 params
数组中打包一个数组。
但我想有某种方法可以让一个论点重复多次。
Shawn 是对的,但你需要稍微改变一下选项参数:
getoptions
需要一个列表的列表
set options {
{a "set the atime only"}
{m "set the mtime only"}
{c "do not create non-existent files"}
{r.arg "" "use time from ref_file"}
{t.arg -1 "use specified time"}
}
getopt
想要一个仅包含选项名称的一维列表
set opts {a m c r.arg t.arg}
一个例子:
package req cmdline
set argv {-a -t 1234 -t 4567}
set opts {a m c r.arg t.arg}
set params [dict create]
while {[set status [cmdline::getopt argv $opts opt arg]]} {
# TODO handle errors, when $status == -1
dict lappend params $opt $arg
}
puts $params # => a 1 t {1234 4567}