仅在TCL中指定了argv时才将值赋给变量

时间:2018-11-20 09:27:36

标签: tcl

我是TCL脚本的新手。我有一个名为“ Sample.tcl”的脚本。在Sample.tcl中,我有一个名为URLSession的变量。如果存在特定的argv,我该如何为变量赋值?

$name

仅当我指定Sample.tcl -step xyz 时,-step应该是$name

2 个答案:

答案 0 :(得分:0)

在这种情况下,我不确定$name可能是什么(这是变量的真正的不寻常名称,通常使用变量变量名是个坏主意),但是在猜想您在这种情况下尝试将step设置为xyz,可以将其放在脚本中:

apply {{} {
    # For each pair of values in the arguments (after the script name)
    global argv
    foreach {key value} $argv {
        # Safety-check: if the key starts with a hyphen...
        if {[string match -* $key]} {
            # ... strip the leading hyphen(s)
            set varname [string trimleft $key "-"]
            # ... bind that global var name to a local name
            upvar 1 $varname var
            # ... and set the variable to the value we've got.
            set var $value
        }
    }
}}

这是在apply中完成的,因此我们不会使用所有工作变量(keyvaluevarname和{{1} }),因为我们实际上不需要为某件事做一个程序,所以只要做一次。

这不是安全的代码,无论如何都不是,但这是使某项工作有效且灵活的方式。


通常,解析命令行参数可能需要花费大量时间才能完全正确,并且有各种软件包可以提供帮助,但这仅在编写供其他人运行的代码时才非常重要。如果只适合自己,那么您可能会变得很草率,并在几分钟之内完成工作。

答案 1 :(得分:0)

使用tcllib中的cmdline软件包,您可以编写:

#!/usr/bin/env tclsh

package require cmdline

set options {
    {step.arg       ""      "Set the step value"}
}

try {
    array set params [cmdline::getoptions argv $options]
} on error e {
    puts stderr $e
    exit 1
}

if {$params(step) ne ""} {
    set name $params(step)
}

if {[info exists name]} {
    puts "name = $name"
} else {
    puts "name is not set"
}