用于修剪 if else 条件的 Shell 脚本

用于修剪 if else 条件的 Shell 脚本

当我运行下面的脚本时,我得到了成功的输出。我在这里尝试的是,我应该连接到下面列出的所有虚拟机,并且当脚本 ssh 时,wasadmds03它应该将输出打印为product detail,与其他虚拟机类似,它也应该执行命令 “cat /source/package.json | grep 版本”在所有虚拟机上。

我得到了我需要的输出 - 但是有没有办法修剪重复的“if then”语句?我已经使用了“if then”语句四次,想象一下,如果我想对 50 个虚拟机进行类似的练习,有没有办法以更短的方式编写这个程序?

wasadmds03 - product detail
wasadmds04 - product list
wasadmls03 - Cart
wasadmls05 - checkout
  • 脚本

**

#!/bin/bash
for i in `cat /tmp/ms_test`
do
        if [ $i = wasadmds03 ]
        then
            echo "Product Detail"
            ssh $i "cat /source/package.json | grep version"
        fi
        if [ $i = wasadmds04 ]
        then
            echo "Product list"
            ssh $i "cat /source/package.json | grep version"
        fi
        if [ $i = wasadmls03 ]
        then
            echo "Merchant"
            ssh $i "cat /source/package.json | grep version"
        fi
        if [ $i = wasadmls05 ]
        then
            echo "Account Details"
            ssh $i "cat /source/package.json | grep version"
        fi
done

答案1

因此,问题似乎是您希望根据从文件中读取的主机名输出特定标签。

我们当然可以稍微压缩一下代码。如果我们将每个主机应该不同的文本标签存储在关联数组中,我们最终可以得到

printf '%s\n' "${labels[$remote]}"
ssh -n "$remote" 'cat /source/package.json' | jq -r .version

...在循环内。

在这里,我冒昧地将i循环变量重命名为remote更具描述性。我也在使用printf而不是echo(参见“为什么 printf 比 echo 更好?”),并且我选择使用真正的 JSON 解析器来解析 JSON 数据文件,jq而不是使用grep(这也意味着我只是猜测versionJSON 数据中有一个顶级键)。

ssh必须调用它ssh -n,以便它不会读取我们正在使用的循环迭代的输入。

labels数组可以像这样创建:

declare -A labels
labels=(
    ['wasadmds03']='Product Detail'
    ['wasadmds04']='Product List'
    ['wasadmls03']='Merchant'
    ['wasadmls05']='Account Details'
)

请注意,如果您有更多远程主机名,则应以类似的方式在此数组中列出这些主机名。您需要列出每一项,因为您不以任何其他方式提供此数据。

这与正确读取远程主机名一起/tmp/ms_test(参见“理解“IFS=读取-r行”") 为我们提供了以下脚本:

#!/bin/bash

declare -A labels
labels=(
    ['wasadmds03']='Product Detail'
    ['wasadmds04']='Product List'
    ['wasadmls03']='Merchant'
    ['wasadmls05']='Account Details'
)

while IFS= read -r remote; do
    printf '%s\n' "${labels[$remote]}"
    ssh -n "$remote" 'cat /source/package.json' | jq -r .version
done </tmp/ms_test

相关内容