【问题标题】:shell script to accept multiple sets of arrays in for loop在 for 循环中接受多组数组的 shell 脚本
【发布时间】:2016-12-14 11:56:50
【问题描述】:

您好,有人可以帮我编写一个 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 脚本实现这一点?

【问题讨论】:

    标签: bash shell variables for-loop


    【解决方案1】:

    一种 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 循环来完成您的要求。

    【讨论】:

    • 而且,如果你想进一步概括,你可以定义一个数组declare -a hosts=(host1 host2),然后把循环改成for Host in "${hosts[@]}"; do
    • 嗨,史蒂夫,感谢您的快速帮助,它工作正常,但是当我将 host1 作为 as-host1 提供时,as-host2 出现语法错误,它不接受 ' - ' 名称语法错误,靠近意外标记 @ 987654331@declare -a as-host1 =(as-host1_server1)'
    • 所有需要的只是引用主机。我已经更新了上面的 Bash 脚本。
    • 如果此解决方案回答了您的问题,请单击复选标记将其标记为已接受的答案。这将有助于社区并奖励我的努力!
    • 史蒂夫感谢您的快速帮助解决了我的问题,:)
    猜你喜欢
    • 2022-05-17
    • 2016-02-02
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多