我有一些通过在命令行调用中定义变量来执行的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"
答案 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解释器检查确切的语法,上面的脚本只是为了提出这个想法。)