【问题标题】:Decreasing multiple IF ELSE conditions in Unix, Implementing array在 Unix 中减少多个 IF ELSE 条件,实现数组
【发布时间】:2019-11-22 12:39:28
【问题描述】:

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

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 脚本很陌生,我想知道是否有可能使我的脚本更具可读性和更易于编辑!!!

【问题讨论】:

  • Shell 没有多维数组或其他复杂的数据结构。你真的必须为此使用 shell 吗?
  • 实际上,BASH 不支持多维数组,但 ksh 支持(以及复合变量)。也就是说,如果我可以说的话,可以使用多个数组来模拟它们。取决于您心目中/需要的数据类型及其不同的关系。
  • bash 支持带有declare -A 的关联数组(映射)。值可以是数组。
  • 旁注:当您可以使用诸如 ansible 和 puppet 之类的部署工具和诸如 zabbix、graphite 或 nagios 或 prometheus 之类的监控工具时,为什么要自己实现它
  • @Barmar 不幸的是,我只需要在 shell 中执行此操作。谢谢你的回答。

标签: arrays bash shell unix


【解决方案1】:

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

【讨论】:

  • 我尝试了类似for ((i=0; i<${n_services}; i++ )); do eval service_$i=$((1<<$i)); done 并使用.. if (( $((${!server} & ${!checkservice} )) > 0 )) .. 进行测试,但这太复杂了。我赞成您的简短解决方案,它可能会被增强为配置文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2016-08-05
相关资源
最近更新 更多