首页 > 解决方案 > 简单的期望 else 脚本

问题描述

我试图运行一个命令并期待一个输出,我已经准备好了,但如果我没有得到预期的输出,我似乎无法获得正确的语法来做什么。

#!/usr/bin/expect -f
set timeout -1
spawn ./container_check
expect -- "*wpa_supplicant-udmpro:v1.0*"
send -- "exit\r"
else -- "podman container start wpa_supplicant-udmpro\r"
expect eof

如果脚本看到 wpa_supplicant 响应,我希望脚本退出,但如果没有,我也希望它运行“podman container start wpa_supplicant-udmpro”,我似乎无法让它这样做。

#!/usr/bin/expect -f
set timeout -1
spawn ./container_check
if [ expect "*wpa_supplicant-udmpro:v1.0*" ];
    then { send "exit\r"; }
else { send "podman container start wpa_supplicant-udmpro\r"; }
expect eof
fi

另一个尝试,我不知道我在做什么 LOL

标签: if-statementexpect

解决方案


我感觉应该将“podman”命令发送到操作系统,而不是“container_check”程序。如果属实,那么也许这就是您所需要的:

如果“container_check”退出非零或向 stderr 发出任何内容,exec将出错并且需要捕获:

#!/usr/bin/expect -f
if {[catch {exec ./container_check 2>@1} check_output] != 0} {
    # a non-zero exit status: do we care?
}
if {![string match "*wpa_supplicant-udmpro:v1.0*" $check_output]} {
    exec podman container start wpa_supplicant-udmpro
}

参考:exec字符串

如果container_check程序确实需要交互,那我就错了。


由于您使用的是 sshpass,因此您无需与 ssh 进程交互:expect 是该工作的错误工具。坚持使用简单的 bash 脚本。

#!/bin/bash
doSsh() {
    sshpass -p "password" ssh -o StrictHostKeyChecking=no username@ipaddress "$@"
}

if [[ "$( doSsh docker container ls )" != *"wpa_supplicant-udmpro:v1.0"* ]]; then
    doSsh podman container start wpa_supplicant-udmpro
fi

推荐阅读