Tentando escrever um script para analisar uma lista de domínios para confirmar se seus registradores estão sendo atualizados corretamente. Eu executo o whois em um nome de domínio e tudo que quero são as linhas que COMEÇAM com "Servidor de nomes" ou "Nome de domínio"
Quando executo e grep a saída 'whois' do shell, funciona perfeitamente:
$ whois customerdomain.com | egrep -e ^'Name Server|^Domain Name'
Domain Name: CUSTOMERDOMAIN.COM
Name Server: ns.buydomains.com
Name Server: this-domain-for-sale.com
Mas quando pego uma lista de domínios e os coloco em um script de shell, o operador "ou" é ignorado e o "Nome de domínio" não é incluído na saída:
Script de exemplo (whois-list.sh):
#!/bin/bash
whois customerdomain.com | egrep -e ^'Name Server|^Domain Name'
whois contoso.com | egrep -e ^'Name Server|^Domain Name'
whois google.com | egrep -e ^'Name Server|^Domain Name'
whois microsoft.com | egrep -e ^'Name Server|^Domain Name'
Saída:
$ ./whois-list.sh
Name Server: ns.buydomains.com
Name Server: this-domain-for-sale.com
Name Server: ns1-205.azure-dns.com
Name Server: ns3-205.azure-dns.org
Name Server: ns2-205.azure-dns.net
Name Server: ns4-205.azure-dns.info
Eu tentei cerca de 10 variações diferentes que parecem funcionar bem no prompt, mas sempre parecem descartar o operador 'ou' quando executado a partir do script.
Hipótese
Seu contém terminações de linha
whois-list.sh
do Windows/DOS (denotadas ou ) em vez de terminações de linha Unix (denotadas ou ).CRLF
\r\n
LF
\n
O caractere extra (denotado
CR
ou\r
) não é reconhecido pelo shell que interpreta o script como parte do terminador de linha; ele é reconhecido como parte da entrada, portanto fica "colado" ao último argumento passado paraegrep
.Na verdade
egrep
não vê…|^Domain Name
, vê…|^Domain Name\r
onde\r
denota o caractere para o qual você não pretendia passaregrep
. A saída dewhois
nunca corresponde a esse padrão.Confirmar
Se
file whois-list.sh
lhe disser,… with CRLF line terminators
então este é o caso.Alternativamente e sem ferramentas adicionais (como
file
), você pode tentar colocar uma linha como esta no script:onde tudo depois
#
(incluindo\r
, se houver) será visto como um comentário. Se esta linha funcionar e a mesma linha sem#
se comportar mal, então há uma forte pista\r
.Em geral, nem todas as linhas possíveis de código shell podem ser "consertadas" dessa maneira. Esta não é uma boa solução, apenas uma maneira simples de diagnosticar o problema.
E quanto a Shebang?
No Linux, seguir em frente
\r
faria#!/bin/bash
com que o shebang se comportasse mal em primeiro lugar. Essa linha por si só está correta no seu script ou o Cygwin faz algumas correções aqui.Consertar
Uma ferramenta comum para converter arquivos de finais de linha do Windows/DOS em finais de linha Unix é
dos2unix
:(Outras possibilidades: aqui ). Alguns editores de texto GUI podem converter o arquivo para você, mesmo no Windows (por exemplo, Notepad++). Corrigir os finais de linha
whois-list.sh
é a coisa certa a fazer.Não use editores de texto centrados no Windows para editar scripts para Cygwin (ou Linux/Unix). Certifique-se de que o editor que você usa pode salvar seus scripts com terminações de linha Unix.