Usar CONTENTS
para manter o arquivo apenas em echo
novamente é um pouco redundante, você poderia apenas
lines=$(cat "somefile" | grep -E "SEARCHEXPR")
ou melhor
lines=$(grep -E "SEARCHEXPR" "somefile")
Se você quiser apenas a contagem de linhas correspondentes, use grep -c
count=$(grep -c -E "SEARCHEXPR" "somefile")
O problema imediato que você vê é causado pelo fato de que echo
gera sempre a nova linha. No caso em que você obtém pelo menos uma linha a partir das substituições de comandos, isso realmente ajuda, já que substituições de comandos removem novas linhas à direita . Ele também funciona com linhas vazias finais, tente ver: x=$(echo foo; echo; echo); echo "$x"
.
Se você quiser processar as linhas no shell script de alguma outra forma, além de contar, o armazenamento do texto em uma variável pode não ser o melhor. Você poderia tentar
for line in $lines ; do
something with "$line"
done
Mas isso tem os problemas comuns com variáveis não citadas, ou seja, globalização de nomes de arquivos e divisão de palavras no espaço em branco. Uma linha contendo "foo bar doo", seria vista como três, já que, por padrão, os espaços também se dividem.
Você pode querer usar um while read
loop, mas, para isso, um shell que suporte a substituição de processos pode ser bom. Consulte BashFAQ 001 e não muda após encontrar & enquanto href="https://unix.stackexchange.com/questions/143958/in-bash-read-after-a-pipe-is-not-setting-values"> e .