1

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

4

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

将所有“有用的”参数词(您通常认为是参数的所有词)传递给过程的最简单方法是这样做(假设 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 回答