shell脚本在for循环中接受多组数组

时间:2016-12-14 11:56:51

标签: bash shell variables for-loop

您可以在shell脚本上帮助我吗?

我有2个主机和4个服务器,我想使用for循环

host1 -->  host1_server1 host1_server2 
host2 -->  host2_server1 host2_server2 

我想使用for循环来打印两个集合,输出两个集合:

设置1输出

hostname : host1 servers: host1_server1
hostname : host1 servers: host1_server2

设置2输出

hostname : host2 servers: host2_server1
hostname : host2 servers: host2_server2

如何使用Bash shell脚本实现此目的?

1 个答案:

答案 0 :(得分:0)

一个Bash解决方案是使用Bash数组,Indirect Referencesprintf

#!/bin/bash

declare -a hosts=(host1 host2)     # array of variable names; quoting not needed

declare -a host1=("host1_server1" "host1_server2")
declare -a host2=("as-host2_server1" "as-host2_server2")

for Host in "${hosts[@]}"; do
   Indirect="$Host[@]"
   printf "hostname : $Host servers: %s\n" "${!Indirect}"
done

以上产生以下输出:

hostname : host1 servers: host1_server1
hostname : host1 servers: host1_server2
hostname : host2 servers: as-host2_server1
hostname : host2 servers: as-host2_server2

此解决方案还利用printf命令的行为来重用该格式以使用所有参数。从man bash开始,请参阅printf部分:

  

根据需要重用该格式以使用所有参数

作为一个兴趣点,请注意Bash习语"${Variable[@]}"保留数组元素中的任何空格。此外,如果数组中没有元素,则此习语扩展为空。这在很多情况下非常有用。

这些方法相结合,允许单个for循环来完成你所要求的。