在Unix中减少多个IF ELSE条件,实现数组

时间:2019-07-12 18:12:45

标签: arrays bash shell unix

当前,我有以下脚本检查相应的服务是否正在服务器上运行或是否未使用某些内部逻辑。请在下面找到代码段:

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多个服务,其中不同的服务在不同的服务器上运行。同样,将来任何服务都可以被调用/开始在它之前没有运行过的特定节点上运行,在这种情况下,我必须再次更改脚本。

我知道在进行任何更改的情况下,我绝对必须更改脚本并在所有服务器上进行更新,但是我希望此过程不如现在那样痛苦。

我可以实现类似于在脚本开始处定义的数组之类的东西,以指出给定服务是否在特定节点上运行。我从this关于stackoverflow的问题中学到的东西。

我知道多维数组可以用C轻松实现,但是由于我对Shell脚本非常陌生,所以我想知道是否有可能使我的脚本更具可读性和可编辑性!!

1 个答案:

答案 0 :(得分:4)

由于您所有的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实用程序对其进行解析并提取值。这个更精巧的版本留给读者练习(我对这个工具并不是很熟练)。