将参数从命令行传递到 tcl 脚本

Posted

技术标签:

【中文标题】将参数从命令行传递到 tcl 脚本【英文标题】:Passing arguments from command line into a tcl script 【发布时间】:2014-06-24 00:01:23 【问题描述】:

我有一个 TCL 脚本,其中有许多定义为实参的参数。我打算创建一个作业文件,我可以在其中执行具有不同参数组合的 .tcl 脚本,而无需人工干预。

我的意思是:

作业文件(run.sh):

./main.tcl arg1 arg2 arg3 arg4 
./main.tcl arg1 arg3 arg5

现在我希望能够将 run.sh 中提到的每次运行的命令行参数数组“argv”作为数组传递到 main.tcl 脚本中,以便在执行之前在脚本中相应地设置选项。

有没有办法链接 .sh 脚本和 .tcl 脚本?

【问题讨论】:

在您的 shell 脚本中,您可以将所有参数的列表称为 $@。所以就说main.tcl $@ @JohnC - 感谢您的回复!好的,所以如果我在我的 run.sh 中执行 ./main.tcl $@,那么我如何检索 main.tcl 中的参数?使用 argv? 我认为下面的答案可以满足您的需求。 【参考方案1】:

每online document here:

可以将数字传递给脚本并由脚本使用的方法, 如下。

argc argv argv0

所有 Tcl 脚本都可以访问三个预定义变量。 $argc - 传递给脚本的参数项数。 $argv - 参数列表。 $argv0 - 脚本的名称。

要使用参数,脚本可以重写如下。

if  $argc != 2  
    puts "The add.tcl script requires two numbers to be inputed."
    puts "For example, tclsh add.tcl 2 5".
    puts "Please try again."
 else 
    puts [expr [lindex $argv 0] + [lindex $argv 1]]
    

【讨论】:

此链接已失效。 注意,这样写,相当于一个命令注入漏洞,比如tclsh that-script '[exec sh -c id>/dev/tty; echo 1]' 2puts [expr [lindex $argv 0] + [lindex $argv 1]] 更好。 链接是fundza.com/tcl/script_shell/arguments/index.html【参考方案2】:

除了上述答案之外,我发现以下内容很有帮助:

为了在 QuestaSim/ModelSim/Quartus 中运行,我遵循了以下资源:http://www.alteraforum.com/forum/showthread.php?t=3034

通常我们可以使用source 命令运行 .tcl 脚本,但这不会像基本 .tcl 脚本一样正常处理参数。所以通过使用一个流程,你可以达到同样的效果。

【讨论】:

【参考方案3】:

用于演示如何将参数从命令行传递到 TCL 脚本:

创建一个名为 args.tcl 的文本文件,其中包含以下命令:

# If no command line arguments are passed perform no actions
if $argc > 0 
# argv0 conatins the filename of the script
puts "The name of the script is: $argv0"
# argc contains the count of the arguments passed
puts "Total count of arguments passed is: $argc"
# argv contains a list of the arguments
puts "The arguments passed are: $argv"
# Using the List Index of argv print a specific argument
puts "The first argument passed was [lindex $argv 0]"

创建文件后,使用以下命令行调用脚本:

> Tclsh85 args.Tcl ONE 2 3
The name of the script is: args.Tcl
Total count of arguments passed is: 3
The arguments passed are: ONE 2 3
The first argument passed was ONE
>

参考:Tcl/Tk 8.5 Programming Cookbook

【讨论】:

以上是关于将参数从命令行传递到 tcl 脚本的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本处理用户输入

shell脚本处理用户输入

shell脚本处理用户输入

将 0 作为命令行参数传递的问题

命令行运行PHP文件时如何传递参数?

解析/传递命令行参数到bash脚本 - “$ @”和“$ *”之间有什么区别?