0

在我的 bash 脚本中,我需要从命令输出中提取所有主机名以便进一步 ping:

for host in `echo $MXrecords | awk '{ printf "%s", $0; }'` ; do
    ping -c1 $host 2> /dev/null > /dev/null
    if [ "$?" -eq "0" ] ; then
        answ="OK"
    else
        answ="BAD"
    fi

    echo "\t$host [$answ]" 
done

但我有一些额外的字符串:

40 [BAD]
alt2.aspmx.l.google.com. [OK]
30 [BAD]
alt3.aspmx.l.google.com. [OK]

我通过 dig 得到 var MXrecords:

MXrecords=`dig @$DNSserver $domainName IN MX +short +multiline | awk '{ printf "\t%s\n", $0; }'`
4

2 回答 2

1

从输出看起来$MXrecords包含 MX 记录,包括它们的优先级:

40 alt2.aspmx.l.google.com.
30 alt3.aspmx.l.google.com.

尝试替换这个:

`echo $MXrecords | awk '{ printf "%s", $0; }'`

有了这个:

$(echo "$MXrecords" | awk '{print $2}')
于 2013-03-18T19:27:22.557 回答
0

试试这个:

for host in ${MXrecords##* }; do
    if ping -c1 $host &>/dev/null; then
        answ="OK"
    else
        answ="BAD"
    fi

    echo "\t$host [$answ]" 
done

笔记

  • ${MXrecords##* }是一个参数扩展bash 技巧(内置)
  • &>/dev/null是 bash 的简写>/dev/null 2>&1
  • 反引号 ( `) 用于旧式命令替换。建议使用该foo=$(command)语法。内部的反斜杠处理$()不那么令人惊讶,并且$()更容易嵌套。见http://mywiki.wooledge.org/BashFAQ/082
  • 无需测试特殊变量$?,您可以像我在代码段中那样使用布尔逻辑
于 2013-03-18T19:21:26.627 回答