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

问题描述 投票:2回答:4

[我正在整个互联网上搜索,我想我搜索的不是正确的关键字我尝试了大多数:)

我想在tcl / bash中创建带有连字符标记的proc以从用户那里获取带有标记的参数

例如

proc_name -color red -somethingselse black
tcl
4个回答
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

2
投票

使用array set,我们可以将参数及其值分配到数组中。


2
投票

在Tcl中处理此问题的通常方法是将值划分为数组或字典,然后从中挑选出来。它没有提供最多的错误检查量,但是很容易


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