当我运行下面的脚本时,我得到了成功的输出。我在这里尝试的是,我应该连接到下面列出的所有虚拟机,并且当脚本 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
(这也意味着我只是猜测version
JSON 数据中有一个顶级键)。
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