bash 脚本:在输出列表上执行相同的命令?

bash script: Execute the same command on a list of output?

我创建了一个 bash 脚本来执行这个 K8S 命令行:

kubectl get nodes -o yaml | grep -- "- address:"

输出如下所示:

- address: 10.200.116.180
- address: node-10-200-116-180
- address: 10.200.116.181
- address: node-10-200-116-181
- address: 10.200.116.182

我想循环输出列表并对每个地址 ip 进行一些测试,例如:ping 10.200.116.182.

grep替换为sed即可直接获取IP列表;为了将这些 IP 存储在 bash 数组中,您可以使用 mapfile -t 进程替换 :

mapfile -t ips < <( 
    kubectl get nodes -o yaml |
    sed -nE 's/^[[:space:]]*- address: ([0-9.]+)$//p'
)

现在您只需使用 for 循环遍历数组:

for ip in "${ips[@]}"
do
    ping -c 1 "$ip"
done

您可以将输出通过管道传输到 xargs 并执行您想要的命令。

在你这样做之前你应该清理输出。 在您的示例中,将您的输出通过管道传输到 :

sed -e 's/^[[:space:]]*- address: \([^[:space:]]*\)[[:space:]]*$//g'

你应该得到:

kubectl get nodes -o yaml | grep -- "- address:" | sed -e 's/^[[:space:]]*- address: \([^[:space:]]*\)[[:space:]]*$//g'

输出应该只是地址,如:

10.200.116.180
node-10-200-116-180
10.200.116.181
node-10-200-116-181
10.200.116.182

现在是使用清理后的输出来执行 ping 的时候了。 要将地址传递给 ping,我们将使用 xargs。 为此,我们将把清理后的输出通过管道传输到:

xargs -I {IP} ping -c 1 -w 5 {IP}

最终命令:

kubectl get nodes -o yaml | grep -- "- address:" | sed -e 's/^[[:space:]]*- address: \([^[:space:]]*\)[[:space:]]*$//g' | xargs -I {IP} ping -c 1 -w 5 {IP}