Bash 脚本未返回任何输出

Bash script not returning any output

我是 linux 环境的新手,我开始为我们公司经常使用的几个命令创建一个自动冒烟测试。基本上,运行 某种 shell 脚本运行多个命令 并且还验证 命令的输出。

我开始写的第一个测试用例是检查我们的服务是否可以成功停止和启动。在研究了 bash 个脚本之后,我想到了这个:

#!/bin/bash

sudo service companyservice stop | grep 'Stopping companyservice ... [  OK  ]' &> /dev/null \
if [ $? == 0 ] then echo "Stopping Company Service: SUCCESS" \
else    echo "Stopping Company Service: FAIL. GO HARASS A DEVELOPER" \
fi

sudo service companyservice start | grep 'Starting companyservice ... [  OK  ]' &> /dev/null \
if [ $? == 0 ] then echo "Starting Company Service: SUCCESS" \
else    echo "Starting Company Service: FAIL. GO HARASS A DEVELOPER" \
fi

我将其保存为 SmokeTest.sh,但是当在命令行上 运行 sh SmokeTest.sh 时,我在输出中看不到任何内容。没有错误,没有失败,没有成功。没有。

非常感谢任何帮助或提示。我正在使用 Red Hat 6.6 OS。 如果我想验证命令的输出,这也应该是在 Linux 上自动化的正确方法吗?

您在 sudo 行末尾的续行字符 \ 使命令行的 if 部分成为 运行。摆脱那些,你应该开始看到语法错误,因为你在 then

之前的 if 语句的条件之后没有 ;

此外,在带有续行字符的行上,您将 stderr 重定向到 /dev/null,这就是为什么您不会看到它抱怨这种情况的原因

如您所述,可以不将 ;if 放在一起,但如果这样做,then 必须在下一行:

if [ -z "$var" ] then

错了但是

if [ -z "$var" ]; then

if [ -z "$var" ]
then

都可以接受。

此外,单行续行符可能丢失了一点。如果 bash 行以 \ 结尾,则意味着下一行实际上应该被视为当前行的一部分。所以在你的例子中:

sudo service companyservice stop | grep 'Stopping companyservice ... [  OK  ]' &> /dev/null \
if [ $? == 0 ] then echo "Stopping Company Service: SUCCESS" \
else    echo "Stopping Company Service: FAIL. GO HARASS A DEVELOPER" \
fi

实际上像

一样被视为单行
sudo service companyservice stop | grep 'Stopping companyservice ... [  OK  ]' &> /dev/null if [ $? == 0 ] then echo "Stopping Company Service: SUCCESS" else    echo "Stopping Company Service: FAIL. GO HARASS A DEVELOPER" fi

这是不对的。如果你从每一行中删除 \ 并确定一种方法来执行 if...then 你应该会更好

&> /dev/null 会将任何 output/errors 定向到 /dev/null,您将看不到任何输出或错误。删除这些部分或将它们重定向到一个文件,例如:

&> log.txt