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 に答える