Bit*_*iot 1 bash command-line tcl expect argv
我有一个 Expect 脚本,它是 bash 脚本的包装器,而 bash 脚本是 scp 的包装器。:)
基本上,我会像这样调用我的 bash 脚本。
myscp host /path filenames
Run Code Online (Sandbox Code Playgroud)
这会要求我输入主机上的 root 密码。而且,我厌倦了一直输入 root。主机是带有 ramdisk 的测试机,因此我无法在主机上设置 ssh。所以我尝试了一下expect,我认为它可以完成这项工作。
无论如何,我可以在我的期望脚本中挑选出位置参数,如下所示:
#!/usr/bin/expect -f
set host [lindex $argv 0];
set path [lindex $argv 1];
#but how to get filenames??
[...]
spawn myscp $host $path $filenames
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试设置文件名 [lrange $argv 2 end],但这只会导致一个参数包含所有带有空格分隔符的文件名。
不管怎样,我基本上想将“$@”传递给myscp。或者甚至不那么雄心勃勃,$@ 假设文件名中没有空格。
我会怎样做呢?
谢谢。
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
Run Code Online (Sandbox Code Playgroud)
该{*}
语法将列表拆分为单独的元素。如果您的 Expect 太旧而无法理解这一点,您将不得不求助于 @Dinesh 的eval
答案。
Expect 是 Tcl 语言的扩展,{*}
语法记录为http://tcl.tk/man/tcl8.6/TclCmd/Tcl.htm的规则 #5