if statement with grep [duplicado]

0

O que eu estou tentando fazer é obter a entrada do usuário e pesquisar o arquivo. Se ele corresponder, ele mostrará o resultado, senão ele irá ecoar a palavra-chave $ não encontrada.

Mas meu script é sempre falha de retorno.

       read -p "Enter keyword: " keyword
       if search="$(cat ./records | grep '$keyword')"
       then
       echo "$search"
       else
        echo "$keyword not found!"
       fi ;;
    
por Prin Puyakul 27.09.2017 / 08:17

2 respostas

1
read -r -p 'Enter pattern: ' pattern

result=$( grep "$pattern" records )

if [ -n "$result" ]; then
    printf '%s\n' "$result"
else
    printf 'No match found for pattern "%s"\n' "$pattern"
fi
  • A designação para search ( result no meu código) é melhor feita fora da instrução if .

  • Teste com -n ("esta string não está vazia?") no resultado.

  • Não faça uma citação simples da variável (isso evitará que o shell expanda seu valor). Faça uma citação dupla em seu lugar.

  • Observe "padrão" em vez de "palavra-chave". A maneira como você usa grep aqui usará a string fornecida pelo usuário como uma expressão regular (um padrão, como cat.*dog ), não necessariamente como uma string fixa simples.

  • cat deve ser usado para concatenar arquivos, na maioria dos casos é mais ou menos inútil.

  • Use read -r para permitir que o usuário insira barras invertidas.

Alternativamente:

read -r -p 'Enter pattern: ' pattern

if grep "$pattern" records; then
    true
else
    printf 'No match found for pattern "%s"\n' "$pattern"
fi

Isso evita o armazenamento de uma quantidade potencialmente grande de dados em uma variável shell e, em vez disso, depende do status de saída de grep para informar se o padrão pode ou não ser encontrado no arquivo. Se o padrão for encontrado, as linhas correspondentes serão impressas (e nada mais precisa ser feito, portanto, a declaração true ).

Com relação ao uso de printf no lugar de echo : printf é melhor que o eco?

Mais curto:

read -r -p 'Enter pattern: '

grep "$REPLY" records || printf 'No match found for pattern "%s"\n' "$REPLY"
    
por 27.09.2017 / 08:28
0

Veja abaixo:

read -p "Enter keyword: " keyword

if search=$(grep "$keyword" ./records)
        then
                echo "$search"
        else
                echo "$keyword not found!"
        fi
  1. Não use aspas com $() como @jasonwryan foi anotado acima
  2. Não é necessário usar cat piping com grep . Use grep <pattern> file em vez
  3. Excluir ;; após fi
por 27.09.2017 / 08:29