【问题标题】:How to pass the bash equivalent "$@" from expect script如何从期望脚本传递 bash 等效的“$@”
【发布时间】:2014-12-16 17:34:55
【问题描述】:

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

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

myscp host /path filenames

这会要求我在主机上输入 root 密码。而且,我厌倦了一直输入root。 host 是带有 ramdisk 的测试机器,所以我无法在 host 上设置 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

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

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

我会怎么做?

谢谢。

【问题讨论】:

  • 顺便说一句,我实际上建议将其标记为 tcl 问题而不是 bash 问题,因为这里期望使用 tcl 语法;熟悉 bash 并没有能力回答它。

标签: bash command-line tcl expect argv


【解决方案1】:
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

{*} 语法将列表拆分为各个元素。如果您的 Expect 太老而无法理解,您将不得不求助于 @Dinesh 的 eval 答案。

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

【讨论】:

  • 谢谢!那行得通。我会绞尽脑汁好几个小时才想出这个解决方案。呵呵……你让我省了很多麻烦。 :)
【解决方案2】:

你快到了,伙计。您只需在spawn 之前添加eval。这样就足够了。

#!/usr/bin/expect -f

eval spawn myscp [lrange $argv 0 end]

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

参考:eval & Exploring Expect

【讨论】:

  • 是的,我也试过了,但没用。不过谢谢你的建议。我得到“评估没有这样的文件或目录”。然后我尝试将 bash -x 放在前面,这似乎更进一步,但现在我得到了所有这些调试内容,这是不可取的,而且似乎搞砸了预期。
猜你喜欢
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2015-07-26
  • 2017-06-20
  • 1970-01-01
  • 2022-11-22
相关资源
最近更新 更多