在我的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; }'`
答案 0 :(得分: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}')
答案 1 :(得分: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##* }
是parameter expansion bash技巧(建筑物)&>/dev/null
是>/dev/null 2>&1
`
)用于旧式命令替换。建议使用foo=$(command)
语法。 $()
内的反斜杠处理不那么令人惊讶,$()
更容易嵌套。请参阅http://mywiki.wooledge.org/BashFAQ/082 $?
,您可以像我在我的代码段中一样使用布尔逻辑