如何使用连字符标志参数创建 tcl proc

Vla*_*iev 2 tcl

我在整个互联网上搜索,我想我没有搜索到正确的关键字,我尝试了其中的大部分 :)

我想在 tcl/bash 中创建一个带有连字符标志的过程,以从用户那里获取带有标志的参数

前任。

proc_name -color red -somethingselse black
Run Code Online (Sandbox Code Playgroud)

Pet*_*rin 5

其实很容易做到。此代码允许缩写选项名称、标志选项(-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)

文档:arraybreakerrorlassignlindexllengthprocputssetswitchwhile