我在互联网上搜索,我想我搜索的不是正确的关键字 我尝试了大部分:)
我想在tcl / bash中创建一个带有连字符标志的proc来获取来自用户的标志的参数
离。
proc_name -color red -somethingselse black
答案 0 :(得分:4)
-quxwoo
)以及使用--
标记或出现非选项参数来停止读取选项的功能。在该示例中,未知选项名称会引发错误。传递选项解析循环后,args
包含剩余的命令行参数(如果使用的话,不包括--
标记)。
proc foo args {
array set options {-bargle {} -bazout vampires -quxwoo 0}
while {[llength $args]} {
switch -glob -- [lindex $args 0] {
-bar* {set args [lassign $args - options(-bargle)]}
-baz* {set args [lassign $args - options(-bazout)]}
-qux* {set options(-quxwoo) 1 ; set args [lrange $args 1 end]}
-- {set args [lrange $args 1 end] ; break}
-* {error "unknown option [lindex $args 0]"}
default break
}
}
puts "options: [array get options]"
puts "other args: $args"
}
foo -barg 94 -quxwoo -- abc def
# => options: -quxwoo 1 -bazout vampires -bargle 94
# => other args: abc def
这是它的工作原理。首先设置选项的默认值:
array set options {-bargle {} -bazout vampires -quxwoo 0}
然后输入一个处理参数的循环,如果有的话(左)。
while {[llength $args]} {
在每次迭代中,查看参数列表中的第一个元素:
switch -glob -- [lindex $args 0] {
字符串匹配(“glob”)匹配用于使缩写选项名称成为可能。
如果找到值选项,请使用lassign
将值复制到options
数组的相应成员,并删除参数列表中的前两个元素。
-bar* {set args [lassign $args - options(-bargle)]}
如果找到了一个标志选项,请将options
数组的相应成员设置为1,并删除参数列表中的第一个元素。
-qux* {set options(-quxwoo) 1 ; set args [lrange $args 1 end]}
如果找到特殊--
标记,请将其从参数列表中删除并退出选项处理循环。
-- {set args [lrange $args 1 end] ; break}
如果找到尚未处理的选项名称,则引发错误。
-* {error "unknown option [lindex $args 0]"}
如果第一个参数与上述任何一个都不匹配,我们似乎已经用完了选项参数:只需退出循环。
default break
文档:array,break,error,lassign,lindex,llength,proc,{{3 }},puts,set,switch
答案 1 :(得分:2)
在Tcl中处理此问题的常用方法是将值插入数组或字典中,然后从中挑选出来。它没有提供最大量的错误检查,但这么容易才能正常工作。
withNewWindow({ button.click() }, close: false, wait: true) {
//Other things
withConfirm { driver.close() }
}
执行错误检查需要付出更多努力。这是一个简单的版本
proc myExample args {
# Set the defaults
array set options {-foo 0 -bar "xyz"}
# Read in the arguments
array set options $args
# Use them
puts "the foo option is $options(-foo) and the bar option is $options(-bar)"
}
myExample -bar abc -foo [expr {1+2+3}]
# the foo option is 6 and the bar option is abc
答案 2 :(得分:1)
使用array set
,我们可以将参数及其值分配到数组中。
proc getInfo {args} {
# Assigning key-value pair into array
# If odd number of arguments passed, then it should throw error
if {[catch {array set aInfo $args} msg]} {
return $msg
}
parray aInfo; # Just printing for your info
}
puts [getInfo -name Dinesh -age 25 -id 974155]
将产生以下输出
aInfo(-age) = 25
aInfo(-id) = 974155
aInfo(-name) = Dinesh
答案 3 :(得分:0)
#flag defaults
set level 1
set inst ""
# Parse Flags
while {[llength $args]} {
set flag [lindex $args 0]
#puts "flag: ($flag)"
switch -glob $flag {
-level {
set level [lindex $args 1]
set args [lrange $args 2 end]
puts "level:($level) args($args)"
} -inst {
set autoname 0
set inst [lindex $args 1]
set args [lrange $args 2 end]
puts "inst:($inst) args($args)"
} -h* {
#help
puts "USAGE:"
exit 1
} -* {
# unknown option
error "unknown option [lindex $args 0]"
} default break
}
}
# remaining arguments
set filename "$args"
puts "filename: $args"