我有一些通过在命令行调用中定义变量来执行的 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"
我不熟悉 tclsh 上的 -def 选项。
但是,要检查是否设置了变量,而不是使用 'catch',您还可以使用 'info exists':
if { ![info exists blah] } {
set blah default_value
}
或者,您可以使用 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 后缀表示这是一个名称/值对参数,如果未列出,它将假定它是一个二进制标志。
您可以catch
使用命令来防止错误中止脚本。
if { [ catch { set foo $<var1> } ] } {
set <var1> defaultValue
}
(警告:我没有用 TCL 解释器检查确切的语法,上面的脚本只是为了给出想法)。