Edição booleana para o Grep

1
        whois='whois 100.43.81.149'
        bool="$(printf %s\n "$whois" | grep -q netname:)"
        if $bool;
            then
                echo "netname: is available"    
            else
                echo "netname: is not available"            
        fi

Estou tentando salvar as informações do comando whois na variável whois . Então, nessa variável, estou pesquisando netname: string e salvando o resultado na variável bool .

Mas, de alguma forma, a variável bool sempre insere true case, embora não deva estar neste contexto.

O que pode estar causando esse problema?

    
por NecNecco 11.04.2016 / 17:17

1 resposta

4

Existem dois problemas principais aqui:

  • $( obtém a saída padrão de um comando, não seu código de saída;
  • if $bool verifica se um comando com o nome correspondente aos dados em $bool retorna 0, não se o bool for 0 ou 1. Ou seja, se $bool continha "foo", o comando "foo" seria executado.

Basta fazer o check diretamente:

if whois 100.43.81.149 | grep -q netname:; then
    ...
fi

Se você precisar armazenar o código de saída em vez de apenas fazer isso diretamente, use [ -eq ,.. ] ou o não POSIX (( :

whois 100.43.81.149 | grep -q netname:
netname_exists=$?

if (( netname_exists == 0 )); then  # Non-POSIX
if [ "$netname_exists" -eq 0 ]; then  # POSIX

Se você deve armazenar a saída de whois para uso posterior também, você pode fazer isso:

whois_data=$(whois 100.43.81.149)
printf '%s\n' "$whois_data" | grep -q netname:  # or use <<< (non-POSIX) or <<
netname_exists=$?
    
por 11.04.2016 / 17:22

Tags