为什么我的嵌套 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