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çã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
grep
aqui 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. -
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"