【问题标题】:How can I use a variable in if condition in expect script?如何在期望脚本的 if 条件中使用变量?
【发布时间】:2019-04-26 13:38:36
【问题描述】:

我正在远程主机(比如 A)上执行期望脚本,我想从该远程主机(A)获取一些环境变量。根据远程主机(A)的环境变量,我想对该主机(A)和运行期望脚本的主机(B)执行一些条件操作。

我可以获取远程变量并在远程变量中设置值。我无法执行 if 条件,因为我可能无法确定正确的语法/格式。

从 google 参考资料中尝试了一些,但无法真正接近可行的解决方案。

send "export vers=`rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$'`\r"
send "echo \$vers\r"
expect -re $prompt
send "`if [[ \$vers -lt 7 ]]; then echo 'RHEL Version is \$vers'; else echo 'RHEL Version is \$vers'; fi`\r"

出现以下错误:

invalid command name "$vers"
    while executing
"\$vers -lt 7 "
    invoked from within
"[ \$vers -lt 7 ]"
    invoked from within
"send "`if [[ \$vers -lt 7 ]]; then echo 'RHEL Version is \$vers'; else echo 'RHEL Version is \$vers'; fi`\r""

需要期望脚本正确执行“if”条件并将值传递给远程主机和我的本地。

【问题讨论】:

  • 你为什么在这里使用expect,而不是在SSH的标准输入上作为heredoc发送代码?
  • 顺便说一句,export 仅在您想让子进程可以访问变量时才需要。如果您只想从同一个 shell 实例访问该变量,最好将其保留为常规 shell 变量,而不是使用 export 使其成为环境变量——环境变量计入最大命令行长度,因此您在进程开始失败之前只能有这么多/这么大。 (当然,在现代系统上,限制至少在数百 KB,但仍然没有理由一开始就将其计入其中)。

标签: bash expect rhel


【解决方案1】:

您可以按照@glenn-jackman 的建议进行操作。还要检查单引号。如果您使用 bash,您可能希望用双引号替换它们。也检查一下:http://www.gnu.org/software/bash/manual/html_node/Single-Quotes.html

【讨论】:

  • 感谢您的参考链接。我会调查
【解决方案2】:

expect 是 的扩展,Tcl 使用方括号的方式与shell 使用反引号的方式相同:命令替换。您需要转义双引号字符串中的括号:

send "if \[\[ \$vers -lt 7 \]\]; then echo 'RHEL Version is \$vers'; else echo 'RHEL Version is \$vers'; fi\r"

或者,通过使用 Tcl 的非插值引用机制来避免反斜杠:

send {if [[ $vers -lt 7 ]]; then echo 'RHEL Version is $vers'; else echo 'RHEL Version is $vers'; fi}
send "\r"

Tcl 中的花括号就像 shell 的单引号。

请注意,我从命令中删除了反引号。

Tcl 语言的完整语法描述为here——只有 12 条规则。本问答涉及规则 4、6 和 7,以及切线的 8 和 9。

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    相关资源
    最近更新 更多