2012-11-30 205 views
1

有没有办法从命令行传递一个proc参数?我的脚本中有我的过程。我想从命令行给出它的参数。在shell脚本中是否有像“$ @”这样的等价命令?TCL中的proc参数

回答

4

您可以使用这些预定义的变量获取命令行参数。

$argc - number items of arguments passed to a script. 
$argv - list of the arguments. 
$argv0 - name of the script. 
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]才能得到真实的

4

命令行参数有很多部分:

  • - Tcl“有用”参数词列表。排除脚本的名称。
  • $argc - “有用”参数词的数量(即,长度为);因为[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如何保证构造列表值,以及我们知道是一个适当的列表。