首页 > 解决方案 > 如何在期望脚本的 if 条件中使用变量?

问题描述

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

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

从谷歌参考中尝试了一些,但无法真正接近工作解决方案。

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”条件并将值传递给远程主机和我的本地主机。

标签: bashexpectrhel

解决方案


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 语言的整个语法——只有 12 条规则。本问答涉及规则 4、6 和 7,以及切线的 8 和 9。


推荐阅读