arrays - 在 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 脚本很陌生,我想知道是否有可能使我的脚本更具可读性和更容易编辑!!!
解决方案
由于您的所有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
实用程序对其进行解析并提取值。这个更详细的版本留给读者作为练习(我对这个工具不是很有经验)。
推荐阅读
- python - numpy 距离矩阵,在没有 [i,j] 和 [j,i] 的情况下按值顺序迭代索引
- javascript - 如何知道哪个按钮重定向到页面
- python - 是否有使用 python 控制台在 Blender 中安装 tensorflow 的正确方法?
- java - 从 dynamoDB 表中删除数据时出错
- java - java.time 比较不一致
- python-3.x - 如何通过 PyTorch 计算图输出损失梯度反向传播路径
- r - 在 R 中创建数据框导入多张工作表
- scala - 运行 TPCDS 基准数据集时出现 Spark 错误 - 找不到 dsdgen
- python - 为什么返回 [],而不是 ["stuff"]?
- reactjs - 边距底部作为键盘高度