为什么我的嵌套 If 条件不起作用?
Why are my nested If conditions not working?
使用bash编写此脚本。出于某种原因,我的第二个 IF 条件不起作用。当条件为假时,我永远不会收到消息“FALSE result”。顺便说一句,我需要再嵌套两个 if 条件,但想让第一个工作。有什么建议吗?
if [[ condition == "true" ]] ; then
echo "TRUE result"
if [[ condition == "false" ]] ; then
echo "FALSE result"
fi
fi
这里有两个问题。首先是 condition
是一个固定的字符串,永远不会等于“真”或“假”。如果它应该是一个变量,则需要使用 "$condition"
来获取它的值(需要 $
来获取变量的值,double-quotes are sometimes needed to avoid weird parsing of the value)。所以像 if [[ "$condition" == "true" ]] ; then
.
第二个问题是,由于第二个 if
嵌套在第一个中,如果第一个条件为假,则永远不会对其进行测试。也就是说,如果 $condition
是“false”,它会测试它是否等于“true”,因为它不是,它会跳过所有直到最后的 fi
,因此永远不会将其与“假”进行比较。
您可能想要的是 elif
(“else if”的缩写)子句而不是嵌套的 if
—— 这样只有在第一个测试失败时才会进行第二个测试, 而不是仅在成功时。请注意,elif
子句不是嵌套的,而是原始 if
语句的扩展,因此不需要额外的 fi
来关闭它。所以像这样:
if [[ "$condition" == "true" ]] ; then
echo "TRUE result"
elif [[ "$condition" == "false" ]] ; then
echo "FALSE result"
fi
如果您要将某物与可能的 strings/patterns 列表进行比较,最好使用 case
语句:
case "$condition" in
true)
echo "TRUE result" ;;
false)
echo "FALSE result" ;;
maybe)
echo "MAYBE result" ;;
*)
echo "Unrecognized result" ;;
esac
read -p "Enter hostname(s): " HOSTS
for host in $HOSTS
do
echo "Test ssh-port on $host"
nc -zv -w 2 $host 22
if [ $? -ne 0 ]; then
echo "$host is not reachable.. See message above. Check hostname/ssh-deamon/firewall"
continue
fi
if [ "$host" = "host1" -o "$host" = "host2" ] ; then
message=$(ssh -q -t adminuser@$host "/usr/bin/sudo systemctl is-active sc4s.service")
echo "The SC4S service on $host is $message"
[ "$message" = "inactive" ] && echo "Please run the startsplunk script to restart the service on $host"
fi
done
使用bash编写此脚本。出于某种原因,我的第二个 IF 条件不起作用。当条件为假时,我永远不会收到消息“FALSE result”。顺便说一句,我需要再嵌套两个 if 条件,但想让第一个工作。有什么建议吗?
if [[ condition == "true" ]] ; then
echo "TRUE result"
if [[ condition == "false" ]] ; then
echo "FALSE result"
fi
fi
这里有两个问题。首先是 condition
是一个固定的字符串,永远不会等于“真”或“假”。如果它应该是一个变量,则需要使用 "$condition"
来获取它的值(需要 $
来获取变量的值,double-quotes are sometimes needed to avoid weird parsing of the value)。所以像 if [[ "$condition" == "true" ]] ; then
.
第二个问题是,由于第二个 if
嵌套在第一个中,如果第一个条件为假,则永远不会对其进行测试。也就是说,如果 $condition
是“false”,它会测试它是否等于“true”,因为它不是,它会跳过所有直到最后的 fi
,因此永远不会将其与“假”进行比较。
您可能想要的是 elif
(“else if”的缩写)子句而不是嵌套的 if
—— 这样只有在第一个测试失败时才会进行第二个测试, 而不是仅在成功时。请注意,elif
子句不是嵌套的,而是原始 if
语句的扩展,因此不需要额外的 fi
来关闭它。所以像这样:
if [[ "$condition" == "true" ]] ; then
echo "TRUE result"
elif [[ "$condition" == "false" ]] ; then
echo "FALSE result"
fi
如果您要将某物与可能的 strings/patterns 列表进行比较,最好使用 case
语句:
case "$condition" in
true)
echo "TRUE result" ;;
false)
echo "FALSE result" ;;
maybe)
echo "MAYBE result" ;;
*)
echo "Unrecognized result" ;;
esac
read -p "Enter hostname(s): " HOSTS
for host in $HOSTS
do
echo "Test ssh-port on $host"
nc -zv -w 2 $host 22
if [ $? -ne 0 ]; then
echo "$host is not reachable.. See message above. Check hostname/ssh-deamon/firewall"
continue
fi
if [ "$host" = "host1" -o "$host" = "host2" ] ; then
message=$(ssh -q -t adminuser@$host "/usr/bin/sudo systemctl is-active sc4s.service")
echo "The SC4S service on $host is $message"
[ "$message" = "inactive" ] && echo "Please run the startsplunk script to restart the service on $host"
fi
done