如何在bash中正确存储host命令的输出

时间:2014-09-16 22:08:33

标签: bash shell ip-address hostname

我试图存储主机提供的IP地址,但主机实际上给出了一个字符串,说明主机名的地址 ip-address 多次找到的许多地址。所以我的问题是我可以以某种方式访问​​地址,而不分割字符串和寻找IP地址?我到目前为止所尝试的内容看起来像这样

ip=$(host "$candidate")

IFS="s " read -ra ADDR <<< "$ip"
for i in "${ADDR[@]}"; do
    echo "$i"
done

其中$候选人持有主机名,但我无法真正将其用于工作。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用其他DNS查找工具,例如dig:

$ foo=($(dig google.com +short))
$ printf '%s\n' "${foo[@]}"
74.125.228.196
74.125.228.206
74.125.228.200
74.125.228.198
74.125.228.193
74.125.228.192
74.125.228.199
74.125.228.197
74.125.228.201
74.125.228.195
74.125.228.194

如果必须使用host,则必须进行字符串拆分:

foo=()
while read -r _ _ _ addr; do
    foo+=("$addr")
done < <(host -t A google.com)
printf '%s\n' "${foo[@]}"

答案 1 :(得分:1)

您可以使用参数扩展/子字符串提取隔离IP地址,如下所示:

#!/bin/bash

while read -r line; do 
    array+=( ${line##* } )      # substring extraction for IP only
done < <(host -t A google.com)

for i in ${array[@]}; do
    echo "$i"
done

<强>输出:

$ bash getip.sh
173.194.115.36
173.194.115.35
173.194.115.40
173.194.115.37
173.194.115.34
173.194.115.39
173.194.115.41
173.194.115.46
173.194.115.33
173.194.115.38
173.194.115.32

您可以使用字符串替换

完成相同的操作
    array+=( ${line//*\ /} )      # string substitution for IP only