我该如何在Expect脚本中的if条件中使用变量?

时间:2019-04-26 13:38:37

标签: bash expect rhel

我正在远程主机(例如A)上执行Expect脚本,我想从该远程主机(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”条件并将该值传递给远程主机和我的本地计算机。

2 个答案:

答案 0 :(得分:0)

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中的花括号就像炮弹的单引号一样。

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

here描述了Tcl语言的整个语法-只有12条规则。此问答涉及规则4、6和7,以及切线8和9。

答案 1 :(得分:0)

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