我有一个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。或者甚至不那么雄心勃勃,$ @假设文件名中没有空格。
我期待怎么做?
感谢。
答案 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
答案 1 :(得分:1)
你几乎就是那个伙伴。您只需在eval
之前添加spawn
即可。这就足够了。
#!/usr/bin/expect -f
eval spawn myscp [lrange $argv 0 end]
lrange
将从第0个索引到最后一个索引提取命令行参数,该索引将等同于bash脚本中的$@
。
参考:eval& Exploring Expect