有没有办法从命令行传递proc的参数?我在脚本中有我的proc。我想从命令行给出它的参数。 shell脚本中是否有类似“$ @”的等效命令?
答案 0 :(得分:4)
您可以使用这些预定义变量获取命令行参数。
$argc - number items of arguments passed to a script.
$argv - list of the arguments.
$argv0 - name of the script.
答案 1 :(得分: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
是正确列表的事实。
答案 2 :(得分: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调用此proc会将$ 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