bash - 如何在期望脚本的 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”条件并将值传递给远程主机和我的本地主机。
解决方案
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 中的花括号就像 shell 的单引号。
请注意,我从命令中删除了反引号。
这里描述了 Tcl 语言的整个语法——只有 12 条规则。本问答涉及规则 4、6 和 7,以及切线的 8 和 9。
推荐阅读
- windows-10 - 如何在使用 Vagrant 和 VirtualBox 创建的 Windows 10 和 CentOS7 虚拟机之间共享(config.vm.synced_folder)目录
- scala - 在批次之间持久存在的内存缓存中激发结构化流式传输
- python - 芹菜工人收到任务但未执行
- vba - Access 2016 中的表单子报表打印
- powershell - SCOM 2012 Windows 服务监控目标对象
- python - 如何在 Cirq 电路中获取经典输入
- python - 在 tensorflow/models/research 中编译 .proto(不是 /object_dectio
- vue.js - 如何更改 Vue 路由器链接的宽度?
- php - Xdebug 安装不工作。怎么修
- python - 将文件中的字符串匹配后的 n 行保存到变量中