我在整个互联网上搜索,我想我没有搜索到正确的关键字,我尝试了其中的大部分 :)
我想在 tcl/bash 中创建一个带有连字符标志的过程,以从用户那里获取带有标志的参数
前任。
proc_name -color red -somethingselse black
Run Code Online (Sandbox Code Playgroud)
其实很容易做到。此代码允许缩写选项名称、标志选项(-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
Run Code Online (Sandbox Code Playgroud)
这就是它的工作原理。首先为选项设置默认值:
array set options {-bargle {} -bazout vampires -quxwoo 0}
Run Code Online (Sandbox Code Playgroud)
然后进入一个循环来处理参数,如果有的话(左)。
while {[llength $args]} {
Run Code Online (Sandbox Code Playgroud)
在每次迭代期间,查看参数列表中的第一个元素:
switch -glob -- [lindex $args 0] {
Run Code Online (Sandbox Code Playgroud)
字符串匹配(“glob”)匹配用于使具有缩写的选项名称成为可能。
如果找到值选项,则使用lassign将值复制到options数组的相应成员并删除参数列表中的前两个元素。
-bar* {set args [lassign $args - options(-bargle)]}
Run Code Online (Sandbox Code Playgroud)
如果找到标志选项,则将options数组的相应成员设置为 1 并删除参数列表中的第一个元素。
-qux* {set options(-quxwoo) 1 ; set args [lrange $args 1 end]}
Run Code Online (Sandbox Code Playgroud)
如果--找到特殊标记,则将其从参数列表中删除并退出选项处理循环。
-- {set args [lrange $args 1 end] ; break}
Run Code Online (Sandbox Code Playgroud)
如果发现尚未处理的选项名称,则引发错误。
-* {error "unknown option [lindex $args 0]"}
Run Code Online (Sandbox Code Playgroud)
如果第一个参数与上述任何一个都不匹配,我们似乎已经用完了选项参数:退出循环。
default break
Run Code Online (Sandbox Code Playgroud)
文档:array、break、error、lassign、lindex、llength、proc、puts、set、switch、while
| 归档时间: |
|
| 查看次数: |
5943 次 |
| 最近记录: |