TCL中proc的参数

时间:2012-11-30 17:35:37

标签: tcl

有没有办法从命令行传递proc的参数?我在脚本中有我的proc。我想从命令行给出它的参数。 shell脚本中是否有类似“$ @”的等效命令?

3 个答案:

答案 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] - 正在执行脚本的程序。通常称为tclshwish(或版本号和扩展名的某些变体),但绝对不一定如此。

将所有“有用的”参数词 - 通常认为是参数的所有词 - 传递给过程的最简单方法是执行此操作(假设为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