我正在尝试创建一个用于结冰的事件处理程序。我的 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
分配和测试都在循环的每次迭代中运行。