如何设置Tcl变量的默认值?

时间:2009-05-11 09:17:15

标签: variables tcl

我有一些通过在命令行调用中定义变量来执行的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"

3 个答案:

答案 0 :(得分:5)

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

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

if { ![info exists blah] } {
  set blah default_value
}

答案 1 :(得分: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后缀表示这是一个名称/值对参数,如果未列出,则假定它是二进制标志。

答案 2 :(得分:0)

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

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

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