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(resultno meu código) é melhor feita fora da instruçãoif. -
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
grepaqui usará a string fornecida pelo usuário como uma expressão regular (um padrão, comocat.*dog), não necessariamente como uma string fixa simples. -
catdeve ser usado para concatenar arquivos, na maioria dos casos é mais ou menos inútil. -
Use
read -rpara 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"