[我正在整个互联网上搜索,我想我搜索的不是正确的关键字我尝试了大多数:)
我想在tcl / bash中创建带有连字符标记的proc以从用户那里获取带有标记的参数
例如
proc_name -color red -somethingselse black
实际上,这很容易做到。此代码允许使用缩写的选项名称,标志选项(在示例中为-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
,我们可以将参数及其值分配到数组中。
在Tcl中处理此问题的通常方法是将值划分为数组或字典,然后从中挑选出来。它没有提供最多的错误检查量,但是很容易
#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"