Bash 脚本 if 条件始终为 true

Bash 脚本 if 条件始终为 true

我正在尝试创建一个用于结冰的事件处理程序。我的 Bash 脚本现在看起来像这样:

#!/bin/bash
# Event Handler for loggin out inactive RDP users

# $1 is $SERVICESTATE$ (OK WARNING UNKNOWN CRITICAL)
# $2 is $SERVICESTATETYPE$ (SOFT HARD)
# $3 is $SERVICEATTEMPT$ (1 through 4)
# $4 is $SERVICDOWNTIME$ (0 no Downtime, >0 Downtime active)
# $5 is SRV29 
# $6 is $host.name$ (1 through 4)


if  [ "$4" > 0 ];
 echo "in downtime, exit";
 then exit
fi

case "$1" in
OK)
echo "ok!"
;;
WARNING)
echo "warning!"
;;
UNKNOWN)
echo "unknown!"
;;
CRITICAL)
echo "critical!"
...

当我在顶部没有 if 语句的情况下执行此脚本时,一切正常。但我想检查 $4 是否大于 0。此测试条件始终返回 true,无论我在此条件中输入什么,它始终会导致“停机,退出”。

所以即使if [ "hello" = "hallo" ]它会立即进入并退出。我还尝试了几乎所有带有引号、不带引号、双括号的变体......等等。我显然做错了什么。有人能发现吗?

提前致谢!

答案1

为了测试整数,您将需要使用:

-eq  #Is equal
-ne  #Is not equal
-lt  #Less than
-le  #Less than or equal
-gt  #Greater than
-ge  #Greater than or equal

所以你的test声明应该是这样的:

if  [ "$4" -gt 0 ];

此外,您的if陈述缺少,then因此应更正为:

if  [ "$4" -gt 0 ]; then

请参阅 参考资料 了解man test更多test选项。

答案2

你的if发言全部被推翻了。

if [ "$4" -gt 0 ]; then
   # stuff to do when $4 > 0
else
   # stuff to do when $4 <= 0
fi

答案3

if  [ ... ];
    echo "in downtime, exit";
    then exit
fi

正如其他答案提到的,then在这种情况下关键字位于错误的位置if。 (从 shell 语言的角度来看,它并没有丢失。如果丢失了,那就是语法错误。)

这里发生的事情是两个都之前的命令then被视为条件的一部分,并且整个命令的返回值用于选择之后的部分是否then运行。对于用分号分隔的命令,只有最后一个命令的退出状态很重要。

由于echo可能总是成功,因此条件分支始终运行。但类似的东西if true; false; then echo something; fi永远不会运行echo。我建议将then关键字与条件放在同一行,以避免意外在它们之间添加某些内容。

使用if,在条件中使用多个命令可能会令人困惑,但使用while它可能有它的用途:我们可以有这样的东西:

while value=$(somecommand) ; [ "$value" != 0 ] ; do
    echo "do some work with $value"
done

分配和测试都在循环的每次迭代中运行。

相关内容