【问题标题】:Extracting data from multiple variable sized arrays in bash onto one line从bash中的多个可变大小数组中提取数据到一行
【发布时间】:2013-05-02 16:38:09
【问题描述】:

我正在编写一个小型 bash 脚本,它将查找任何给定域的 MX 记录,然后打印出主机名、IP 地址和 IP 地址的反向地址。我能够成功地将每个主机名、IP 和反向地址存储到 3 个数组中:

$MXHOSTS[@]
$MXIPS[@]
$MXRHOST[@]

每个都包含相同数量的值,并且取决于域有多少 MX 记录。然后我想做的是打印出一行,其中包含所有三个数组中的数据,用于数组中的值的数量。

我怎么能做到。创建一个新数组,使用此数据或 b 将 3 个数组压缩为 1。使用 echo 从所有三个数组中打印出数据?

例子:

$MXHOSTS[0] = aspmx.l.google.com.
$MXIPS[0] = 74.125.129.27
$MXRHOST[0] = ia-in-f27.1e100.net.

然后,我想打印出来:

aspmx.l.google.com。 :: 74.125.129.27 :: ia-in-f27.1e100.net。

对于每个 MX 记录,它会像这样运行:

[~/scripts]# ./whomails google.com
aspmx.l.google.com. :: 74.125.129.27 :: ia-in-f27.1e100.net.
alt1.aspmx.l.google.com. :: 74.125.129.27 :: qe-in-f27.1e100.net.

等等。

到目前为止,我已经尝试了几种不同的方法,主要是使用 for 循环,但如果域有多个 MX 记录,它将打印出所有可能的组合。只需一个 MX,就可以正常工作。

目前我正在使用以下内容,但这给了我所有可能的组合:

for hosts in "${MXHOSTS[@]}"; do
    for ips in "${MXIPS[@]}"; do
        for rhosts in "${MXRHOSTS[@]}"; do
            echo "$hosts :: $ips :: $rhosts"
        done
    done
done

如何让它只打印相应的数组值,例如 [1-n] 而不是 [@]*[@]*[@]?

【问题讨论】:

    标签: arrays bash for-loop


    【解决方案1】:

    我不确定我是否得到了你想要的,但如果所有数组都有相同的大小,你可以简单地用一个整数索引它们:

    for (( i = 0; i < ${#array1[@]}; ++i )); do
        ${array1[$i]}
        ${array2[$i]}
        ...
        ${arrayn[$i]}
    done
    

    【讨论】:

    • 谢谢,这让我离解决问题更近了一步。现在它只打印数据本身所需的内容,但是如果我更改循环的回声以摆脱 :: 部分,它会添加 12 行回显“::::”或空白。 for (( hosts = 0; hosts &lt; ${#MXIPS}; ++hosts )); do echo "${MXHOSTS[$hosts]} ${MXIPS[$hosts]} ${MXRHOSTS[$hosts]}" done
    • 这可能是因为替换数组元素数量的语法是“${#array1[@]}”,not“${#array1}”。后者将替换第一个元素的字符数。
    • 太棒了,感谢 Rubens 和 @spbnick 帮助我解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多