我正在尝试显示每个主机中部署的应用程序。使用bash脚本我取得了一些成功,除了我想用$ {i}变量下存储的实际主机名替换下面的“hostname”部分。我不能只替换它,因为我不能把一个花括号放在另一个里面。即使我能做到,我仍然遇到麻烦,因为$ {i}将被ls的结果取代。我该如何解决这个问题?
hosts=(usa1 london2)
for i in ${hosts[@]}; do
echo ---${i}---
ssh ttoleung@${i} ls /apps | awk '{ printf("%s:%s\n", "hostname", $0) }'
done
当前输出,基于上面的代码片段:
---usa01---
hostname:E2.gui
hostname:E1.server
---london2---
hostname:E1.gui
期望的输出:
---usa01---
usa01:E2.gui
usa01:E1.server
---london2---
london2:E1.gui
答案 0 :(得分:1)
作为一个介绍说明,它不是一个没有双引号的安全扩展数组名称,除非出于显而易见的原因,因为这样做会将数组中的引用字符串拆分为自己有空格
所以改变
for i in ${hosts[@]};
到
for i in "${hosts[@]}"; # Note the quoted array
现在,遇到问题,您可以使用其-v
参数将bash变量传递给awk。所以改变
ssh ttoleung@${i} ls /apps | awk '{ printf("%s:%s\n", "hostname", $0) }'
到
ssh ttoleung@${i} ls /apps | awk -v hname="${i}" '{ printf("%s:%s\n", hname, $0) }'
这里我们将shell参数${i}
传递给awk
变量hname
。
旁注:由于[ here ]提到的原因,请不要解析ls
输出。但在你的情况下,它并没有太大的区别。
答案 1 :(得分:1)
替换:
awk '{ printf("%s:%s\n", "hostname", $0) }'
使用:
awk -v h="$i" '{ printf("%s:%s\n", h, $0) }'
-v h="$i"
告诉awk创建一个awk变量h
并为其赋值shell变量$i
的值。
除此之外:我们使用h="$i"
而不是h=$i
,因为将shell变量放在双引号中是个好习惯,除非您希望shell执行分词和路径名扩展。