実行時に引数として指定された1つ以上のドメインのMX-esを表示するbashスクリプトを作成しようとしています。スクリプト呼び出しの例:
./domains.sh domain1.com domain-no-mx.com domain2.net domain3.io
予想される出力は、各ドメインに次のものが含まれることです。 MX-es - 各ドメインは新しい行にあるため、各MXの先頭に2つのスペースを使用して読み取ることができます。 MXがない場合は、ドメインの例の出力のみが出力されます。
domain1.com:
mx1.domain1.com
mx2.domain1.com
domain-no-mx.com:
domain2.net:
mx1.domain2.net
mx2.domain2.net
domain3.io:
mx1.domain3.io
これが私が今まで得たものです:
#!/bin/bash
# Check if at least one domain (argument) has been given
if [ $# = 0 ]; then
echo "usage: $(basename $0) list-of-domains" 1>&2
exit 1
fi
for domain in "$@"
do
echo "$domain:"
MX=$(dig $@ MX +short | cut -d " " -f 2)
printf '%s\n' " ${MX[@]}"
# for (( i=0; i<${#arr[@]}; i++));
# do
# echo " ${arr[i]}"
# done
done
これは1つのドメインに対して機能しますが(各MXの先頭に2つのスペースを除く)、複数のドメイン(パラメータ)が指定されている場合はMXを繰り返します。出力とディテールには本当に難しいです。また、2番目のforループと配列を試しました(コメント)。ご覧のとおり、私は初心者であり、ここでコメントを聞きたいです:)
マルコに本当に感謝して安否を伝えます。
ベストアンサー1
何らかの配列や変数に内容を保存する理由はありません。また、ループに$@
各クエリを含めます。dig
あなたの運動に関する私の意見は次のとおりです。
#!/bin/sh
for domain do
dig "$domain" mx +short |
awk -v domain="$domain" 'BEGIN { print domain } { printf "\t%s\n", $2 }'
done
タブを1つずつインデントしますが、簡単に変更できます。
ループ本体は出力を呼び出し、dig
それを直接渡してawk
すべての出力を処理し、BEGIN
ブロックのフィールド自体を印刷し、タブを使用してdig
出力の2番目の列をインデントします。
例を実行してください:
$ ./script kth.se uu.se
kth.se
mx-alt1.kth.se.
mx.kth.se.
uu.se
mailfilter-ng-3.sunet.se.
mailfilter-ng-1.sunet.se.
mailfilter-ng-2.sunet.se.
コードawk
の代わりにすでに行っているのと同様の操作を実行し、各反復の開始時にドメインを印刷してから、残りの出力をインデントできます。ここでは、dig
各出力行の先頭(ビットからスペースまで)を2つのスペースに置き換えることにしました。
#!/bin/sh
for domain do
printf '%s\n' "$domain"
dig "$domain" mx +short | sed 's/.* / /'
done