0

我有一些通过在命令行调用中定义变量来执行的 Tcl 脚本:

$ tclsh84 -cmd <script>.tcl -DEF<var1>=<value1> -DEF<var2>=<value2>

有没有办法检查 var1 和 var2 是否未在命令行中定义,然后为它们分配一组默认值?

我尝试了关键字 global、variable 和 set,但是当我说"if {$<var1>==""}""can't read <var1>: no such variable"

4

3 回答 3

5

我不熟悉 tclsh 上的 -def 选项。

但是,要检查是否设置了变量,而不是使用 'catch',您还可以使用 'info exists':

if { ![info exists blah] } {
  set blah default_value
}
于 2009-05-11T09:47:32.563 回答
1

或者,您可以使用 tcllib 中的 cmdline 包之类的东西。这允许您为二进制标志和名称/值参数设置默认值,并为它们提供描述,以便可以显示格式化的帮助消息。例如,如果您有一个程序需要输入文件名,以及可选的输出文件名和二进制选项来压缩输出,您可能会使用以下内容:

package require cmdline
set sUsage "Here you put a description of what your program does"
set sOptions {
    {inputfile.arg ""  "Input file name - this is required"}
    {outputfile.arg "out.txt"     "Output file name, if not given, out.txt will be used"}
    {compressoutput       "0"      "Binary flag to indicate whether the output file will be compressed"}
}

array set options [::cmdline::getoptions argv $sOptions $sUsage]
if {$options(inputfile) == ""} {puts "[::cmdline::usage $sOptions $sUsage]";exit}

.arg 后缀表示这是一个名称/值对参数,如果未列出,它将假定它是一个二进制标志。

于 2009-05-11T15:14:14.303 回答
0

您可以catch使用命令来防止错误中止脚本。

if { [ catch { set foo $<var1> } ] } {
    set <var1> defaultValue
}

(警告:我没有用 TCL 解释器检查确切的语法,上面的脚本只是为了给出想法)。

于 2009-05-11T09:31:23.557 回答