shell 脚本(如果条件未按预期工作)

shell 脚本(如果条件未按预期工作)

我编写了一个脚本来运行一些linux命令并捕获if子句中的异常并输出结果。基本上,下面代码摘录中的每个变量都代表命令执行状态,如果所有命令都成功执行,我希望成功退出脚本。否则我想退出。在测试脚本时,我故意使命令失败,并且一个变量(例如 X8)的输出为 1。在这种情况下,以下内容无法按预期工作。它向我显示成功消息而不是脚本失败消息。不知道为什么

if [ $X1 != 0 ] &&  [ $X2 != 0 ] &&  [ $X3 != 0 ] && [ $X4 != 0 ] && [ $X5 != 0 ] && [ $X6 != 0 ] && [ $X7 != 0 ] && [ $X8 != 0 ];
then echo "script failed"; exit 1;     
else echo "success"; fi;

答案1

在脚本的顶部添加以下内容:

trap 'echo "Error $? at $LINENO; aborting." 1>&2; exit $?' ERR

然后,每当任何事情抛出未捕获的错误时,脚本都会显示上述消息并退出并显示错误的退出代码。如果您确实想对任何错误使用退出代码 1,则可以更改$?为。1

答案2

首先,您使用的[是 的简写test。从man test

  STRING1 != STRING2
         the strings are not equal

您使用了错误的工具来完成这项工作。你需要的是

 INTEGER1 -eq INTEGER2
         INTEGER1 is equal to INTEGER2

其次,这里有多个条件需要测试。不要使用冗长的 if 语句,而是尝试将每个变量的输出相加,如 Glenn 在注释中建议的那样,并进行测试。或者,在每个命令存在后立即对其输出进行评估。如果您要退出,那么运行其他命令是没有意义的,因为无论如何该命令都会输出。

这是一种循环方法:

for i in $X1 $X2 $X3 ; 
do 
    [ $i -ne 0 ] && { echo "something failed"; exit 1; }
done
echo "Everything OK"

这里的技巧是,您对每个变量进行相同的测试,如果测试失败,脚本将永远不会到达“一切正常”部分

相关内容