如何在 expect 脚本的 if 条件中使用变量?
How can I use a variable in if condition in expect script?
我正在远程主机(比如 A)上执行 expect 脚本,我想从该远程主机(A)获取一些环境变量。根据远程主机的 (A) 环境变量,我想对该主机 (A) 和期望脚本所在的主机 (B) 执行一些条件操作 运行.
我可以获取远程变量并在远程变量中设置值。我无法执行 if 条件,因为我在确定正确的 syntax/format.
时遇到了问题
尝试了 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 是 tcl 的扩展,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 中的大括号类似于 shells 的单引号。
请注意,我从命令中删除了反引号。
描述了 Tcl 语言的完整语法 here -- 只有 12 条规则。本问答涉及规则4、6、7,以及切线8、9。
您可以按照@glenn-jackman 的所有建议进行操作。还要检查单引号。如果您使用 bash,您可能需要用双引号替换它们。检查这个:http://www.gnu.org/software/bash/manual/html_node/Single-Quotes.html 还有。
我正在远程主机(比如 A)上执行 expect 脚本,我想从该远程主机(A)获取一些环境变量。根据远程主机的 (A) 环境变量,我想对该主机 (A) 和期望脚本所在的主机 (B) 执行一些条件操作 运行.
我可以获取远程变量并在远程变量中设置值。我无法执行 if 条件,因为我在确定正确的 syntax/format.
时遇到了问题尝试了 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 是 tcl 的扩展,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 中的大括号类似于 shells 的单引号。
请注意,我从命令中删除了反引号。
描述了 Tcl 语言的完整语法 here -- 只有 12 条规则。本问答涉及规则4、6、7,以及切线8、9。
您可以按照@glenn-jackman 的所有建议进行操作。还要检查单引号。如果您使用 bash,您可能需要用双引号替换它们。检查这个:http://www.gnu.org/software/bash/manual/html_node/Single-Quotes.html 还有。