有没有办法从命令行传递proc的参数?我在脚本中有我的过程。我想从命令行给出它的参数。shell脚本中是否有类似“$@”的等效命令?
问问题
6235 次
3 回答
4
您可以使用这些预定义变量获取命令行参数。
$argc - number items of arguments passed to a script.
$argv - list of the arguments.
$argv0 - name of the script.
于 2012-11-30T17:49:53.697 回答
4
命令行参数有很多部分:
$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
这是一个正确的列表这一事实。
于 2012-12-01T07:00:28.690 回答
0
还有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
于 2012-11-30T19:13:40.753 回答