Bash脚本没有返回任何输出

时间:2015-05-15 20:20:33

标签: linux bash shell scripting automation

我是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上自动化的正确方法吗?

2 个答案:

答案 0 :(得分:1)

\行末尾的换行符sudo正在使您运行的命令行的if部分成为可能。摆脱这些,你应该开始看到语法错误,因为在;

之前if语句的条件之后你没有then

另外,在带有续集字符的行上,您将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的方法,那么您应该处于更好的状态

答案 1 :(得分:1)

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

&安培;> log.txt的