【问题标题】:Trouble passing multi-word argument from bash to expect将多词参数从 bash 传递到期望时遇到问题
【发布时间】:2014-02-11 22:55:20
【问题描述】:

我已经在这里查看了一些相关的问题和答案,但我仍然很难过:-(

我希望将多字命令从 bash 脚本传递到期望脚本。在expect 脚本中,多字命令将由send 语句执行。

所以,多字命令是:

get dump perf 0

它存储在 bash 脚本中名为 usrcmd 的变量中。

expect 脚本是这样调用的:

./userspecifiedcmd.exp root $password $server $usrcmd

在expect脚本中,多字命令提取如下:

set usercommand [lrange $argv 3 3]

而多字命令执行如下:send "$usercommand\r"

结果...

send语句实际发送的字符串是:get

当我启动期望脚本时,我尝试在 $usrcmd 变量周围加上引号,如下所示:

./userspecifiedcmd.exp root $password $server "$usrcmd"

当我这样做时,send 语句发送的字符串是:{get dump perf 0}

我的直觉告诉我有一个简单的解决方法。我的直觉正确吗?

谢谢!

【问题讨论】:

  • 请使用反引号分隔内联代码,并在编辑器中选择并按下{} 键来分隔较大的部分(用\n分隔并在行首添加4个空格)。

标签: bash command-line-arguments expect


【解决方案1】:

expect 脚本应该这样调用:

./userspecifiedcmd.exp root "$password" "$server" "$usrcmd"

始终引用您的 shell 变量,除非您有必要忽略它们。

在期望中,将 args 映射到如下变量:

lassign $argv user password server usercommand

lrange 命令返回一个列表,当您像处理字符串一样处理列表时,您会得到{} 工件。请注意您的 Tcl 数据类型:将列表处理为列表,将字符串处理为字符串。当你有一个列表时,使用join 将它干净地“转换”为一个字符串。

Tcl 手册页很有帮助:http://tcl.tk/man/tcl8.5/TclCmd/contents.htm
和 Tcl 教程一样:http://tcl.tk/man/tcl8.5/tutorial/tcltutorial.html

【讨论】:

  • 谢谢格伦。像往常一样在钱上。现在就像一个魅力。 Tcl 教程链接现在在我的“工具”文件夹中,将是我继续寻找答案的第一站。
【解决方案2】:

我不确定这是不是最好的解决方案,但您可以这样做:

ls -1 < "echo $(ls a*)"

所以我们将所有 a* 内容作为所有文件的一部分列出。

在你的情况下,

./userspecifiedcmd.exp root $password $server < "echo $usrcmd"

【讨论】:

  • 我看不出这是如何解决这个问题的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
相关资源
最近更新 更多