-d
не имеет особых свойств, поэтому отключать нечего.
Как упоминал cuonglm, вы видите ошибку из-за неправильного цитирования переменной $ argv [1]
, а не из-за какого-то воображаемого специального свойства -d
. Вот доказательство:
$ csh
% if ( "-d" == "-d" ) echo true
true
% if ( -d == "-d" ) echo true
if: Missing file name.
Если вы хотите просто составить таблицу имен хостов и IP-адресов, и вам не особо важно использовать nslookup
, я, по-видимому, смог создать желаемый результат с помощью быстрого for.. echo
цикла :
for h in $( cat hosts.list ); do
a=$(dig +short $h | head -n1)
echo -e "$h\t${a:-Did_Not_Resolve}"
done
dig
является немного более дружественным -к -DNS-инструментом для сценариев, чем nslookup
, использование опции +short
делает вывод еще чище. Вывод запроса, для которого нет записи, представляет собой пустую строку, поэтому я использую встроенное -в bash
расширение параметра по умолчанию(${var:-default}
)для обработки случая отсутствия записи, дающего ответ «по умолчанию» Did_Not_Resolve
. ].
$ dig www.example.com
; <<>> DiG 9.10.6 <<>> www.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23579
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;www.example.com. IN A
;; ANSWER SECTION:
www.example.com. 20308 IN A 93.184.216.34
;; Query time: 28 msec
;; SERVER: 172.28.8.1#53(172.28.8.1)
;; WHEN: Fri Jun 01 12:02:27 MST 2018
;; MSG SIZE rcvd: 60
$ dig +short www.example.com
93.184.216.34
Окончательный выход – это выход:
www.example.com 93.184.216.34
www.google.com 172.217.14.68
host.doesnotexist.tld Did_Not_Resolve
unix.stackexchange.com 151.101.129.69
Альтернативой dig
также являетсяhost
:
$ for h in $(cat hosts.list); do host $h; done
www.example.com has address 93.184.216.34
www.example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
www.google.com has address 216.58.193.196
www.google.com has IPv6 address 2607:f8b0:4007:80d::2004
Host host.doesnotexist.tld not found: 3(NXDOMAIN)
unix.stackexchange.com has address 151.101.129.69
unix.stackexchange.com has address 151.101.1.69
unix.stackexchange.com has address 151.101.65.69
unix.stackexchange.com has address 151.101.193.69
В ответ на вопросы в комментарии ниже:
Единственная опция, которую я использую для dig
, — это +short
, которая уменьшает вывод либо до IP-адреса данного хоста, либо до пустой строки в противном случае. Я запускаю dig
в подоболочке ($( dig [...] )
), потому что я фиксирую его вывод и присваиваю его переменнойa
(для «адреса» ). Я передаю вывод dig
через head -n1
, так как некоторые хосты (, такие как хост unix.stackexchange.com
, возвращают несколько IP-адресов; для простоты я просто беру первый.
Причина, по которой это извлекается в переменную, заключается в том, что мы можем использовать простой прием расширения параметра для предоставления текста «Не разрешено» вместо пустой строки, как описано ранее в этом документе.
Расширение в соответствии с запросом на оператор echo
, в частности:
echo -e "$h\t${a:-Did_Not_Resolve}"
-e
указывает echo
, что я буду использовать e скейп-последовательности. В этом случае я использую \t
, который в сочетании с -e
становится Tab , а не буквальным экранированием t
. $h
, как и следовало ожидать, просто заменяется содержимым переменной h
. \t
, как объяснялось ранее, становится Tab. ${a:-Did_Not_Resolve}
. Ах, вот где волшебство.bash
имеет возможность при расширении параметров проводить небольшой самоанализ как часть процесса. Синтаксис ${var:-default}
расширяется до содержимого переменнойvar
или , если она либо не установлена, либо равна нулю, предоставленная замена (в этом примере default
; или в реальном случае использования здесьDid_Not_Resolve
). Вы можете найти более подробную информацию об этом на странице руководства bash
, в разделе «Расширение параметров». Конечным результатом этого является вывод в каждой строке в следующем порядке имени хоста, вкладки и либо адреса, если он был, либо текста Did_Not_Resolve
, если его не было..