如何从expect脚本传递等效的“$ @”

时间:2014-10-21 13:12:49

标签: bash command-line tcl expect argv

我有一个expect脚本,它是bash脚本的包装器,它是scp的包装器。 :)

基本上,我会像这样调用我的bash脚本。

myscp host /path filenames

这会要求我在主机上输入root密码。而且,我厌倦了必须一直输入root。 host是带有ramdisk的测试机,所以我无法在主机上设置ssh。所以我一直在期待,我认为它会起作用。

无论如何,我可以在我的期望脚本中选择位置参数,如下所示:

#!/usr/bin/expect -f
set host [lindex $argv 0];
set path [lindex $argv 1];
#but how to get filenames??
[...]
spawn myscp $host $path $filenames

到目前为止,我已尝试设置文件名[lrange $ argv 2 end],但这只会产生一个包含所有带空格分隔符的文件名的参数。

无论如何,我基本上想把“$ @”传递给myscp。或者甚至不那么雄心勃勃,$ @假设文件名中没有空格。

我期待怎么做?

感谢。

2 个答案:

答案 0 :(得分:4)

set host [lindex $argv 0]
set path [lindex $argv 1]
set filenames [lrange $argv 2 end]

# or, the less readable
set filenames [lassign $argv host path]

# and then
spawn myscp $host $path {*}$filenames

{*}语法将列表拆分为各个元素。如果您的期望太老而无法理解,那么您将不得不诉诸@ Dinesh的eval答案。

Expect是Tcl语言的扩展,{*}语法记录为http://tcl.tk/man/tcl8.6/TclCmd/Tcl.htm

的规则#5

答案 1 :(得分:1)

你几乎就是那个伙伴。您只需在eval之前添加spawn即可。这就足够了。

#!/usr/bin/expect -f

eval spawn myscp [lrange $argv 0 end]

lrange将从第0个索引到最后一个索引提取命令行参数,该索引将等同于bash脚本中的$@

参考:eval& Exploring Expect