首页 > 解决方案 > 在 Unix 中减少多个 IF ELSE 条件,实现数组

问题描述

目前我有下面的脚本来检查相应的服务是否在我的服务器上运行或者没有使用一些内部逻辑。请在下面找到代码片段:

MY_SERVER_ID=X22 //stored somewhere in profile of the servers

if [ "$MY_SERVER_ID" = "X11" -o "$MY_SERVER_ID" = "X22" -o "$MY_SERVER_ID" = "X33" ]
then

##do xx

     echo "  Service 1 : Running "

fi

if [ "$MY_SERVER_ID" = "X11" -o "$MY_SERVER_ID" = "X22" ]
then

##do xx

     echo "  Service 2 : Running "

fi

现在,由于并非所有服务器都运行所有服务,因此 If 条件变得更加不可读/不必要的复杂。目前我有 10 多台服务器和 8 多台服务,不同的服务在不同的服务器上运行。此外,将来任何服务都可以被调用/开始在之前未运行的特定节点上运行,在这种情况下,我必须再次更改脚本。

我知道如果发生任何更改,我肯定必须更改脚本并在所有服务器中进行更新,但是我想让这个过程比现在更痛苦。

我可以实现类似在脚本开头定义的数组,以指出给定服务是否在特定节点上运行。我从stackoverflow上的这个问题中得到了一些东西。

我知道多维数组可以很容易地在 C 中实现,但由于我对 shell 脚本很陌生,我想知道是否有可能使我的脚本更具可读性和更容易编辑!!!

标签: arraysbashshellunix

解决方案


由于您的所有if检查都使用相同的变量,因此您可以将其简化为case

case "$MY_SERVER_ID" in
X11|X22|X33)
    echo "Service 1 running" ;;
esac

bash没有多维数组,但您可以使用空格分隔的字符串代替第二维,只要值很简单。

declare -A services
all_services=([X11]="1 2" [X22]="1 2" [X33]="1")
services=${all_services[$MY_SERVER_ID]}
for i in $services; do
    echo "Service $i running"
done

另一种可能性是将数据存储在 JSON 文件中,并使用该jq实用程序对其进行解析并提取值。这个更详细的版本留给读者作为练习(我对这个工具不是很有经验)。


推荐阅读