【发布时间】:2012-11-30 17:35:36
【问题描述】:
有没有办法从命令行传递 proc 的参数?我在脚本中有我的过程。我想从命令行给出它的参数。 shell脚本中是否有类似“$@”的等效命令?
【问题讨论】:
标签: tcl
有没有办法从命令行传递 proc 的参数?我在脚本中有我的过程。我想从命令行给出它的参数。 shell脚本中是否有类似“$@”的等效命令?
【问题讨论】:
标签: tcl
您可以使用这些预定义变量获取命令行参数。
$argc - number items of arguments passed to a script.
$argv - list of the arguments.
$argv0 - name of the script.
【讨论】:
命令行参数有很多部分:
$argv — “有用的”参数词的 Tcl 列表。不包括脚本的名称。$argc — “有用的”参数词的数量(即 $argv 的长度);考虑到[llength $argv] 也能正常工作,因此很少使用。$argv0 — 正在执行的主脚本的名称。[info nameofexecutable] — 正在执行脚本的程序。通常称为 tclsh 或 wish(或带有版本号和扩展名的一些变体),但不一定如此。将所有“有用的”参数词(您通常认为是参数的所有词)传递给过程的最简单方法是这样做(假设 Tcl 8.5 或更高版本):
theProc {*}$argv
请注意,这必须在所有对proc 的调用完成之后进行; proc 是定义过程的命令,而不是过程的声明。 (不同之处?可以想象,可以在文件的更深处看到声明,但 Tcl 不能那样工作。)
我经常喜欢在生产代码中将上述内容包含在一些异常处理中,以便可以很好地报告任何错误,而不是转储堆栈跟踪:
if {[catch {theProc {*}$argv} msg]} {
handleError $msg
}
在 8.5 之前,您需要一种更丑陋的方式:
eval theProc $argv
这仍然是安全的(在形式上),因为 Tcl 如何保证构造列表值,并且我们知道 $argv 是一个正确的列表。
【讨论】:
还有args 用于可变数量的参数。
proc foo args {
foreach arg $args {
puts "arg=$arg"
}
}
所以调用 foo 会打印这个:
% foo 1
arg=1
% foo 1 2 3
arg=1
arg=2
arg=3
%
请注意,使用 $argv 调用此过程会将 $argv 的整个内容视为 $argc 列表中的单个元素:
$ cat ar.tcl
#!/usr/bin/tclsh
proc foo args {
foreach arg $args {
puts "arg=$arg"
}
}
foo $argv
$
$ ./ar.tcl 1 2 3
arg=1 2 3
您需要使用[lindex $args 0] 来获取真正的$argv
【讨论】: