在TCL::cmdline或相关包中,是否可以指定一个可以多次设置的选项?

问题描述 投票:0回答:1

例如,在

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
数组中打包一个数组。

但我想有某种方法可以让一个论点重复多次。

tcl expect
1个回答
0
投票

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}
© www.soinside.com 2019 - 2024. All rights reserved.