Você tem alguns equívocos. Primeiro de tudo, o formato do while read ... do
que você está tentando usar é:
while read var; do ...; done < file
E não
while read var file; do ...; done < file
Basicamente, while read var; do ...; done < file
lerá cada linha de file
e a salvará como var
. Qualquer coisa entre read
e do
é considerada uma variável. Se você der mais de uma variável, a linha será dividida em espaço em branco (bem, no valor da variável $IFS
que é \t
, \n
e espaço, por padrão) e salva nas variáveis fornecidas. Conforme explicado em help read
:
Reads a single line from the standard input, or from file descriptor FD if the -u option is supplied. The line is split into fields as with word splitting, and the first word is assigned to the first NAME, the second word to the second NAME, and so on, with any leftover words assigned to the last NAME.
Então, por exemplo:
$ echo "foo bar baz zab" | while read v1 rest; do echo "v1:$v1, rest:$rest"; done
v1:foo, rest:bar baz zab
$ echo "foo bar baz zab" | while read v1 v2 rest; do echo "v1:$v1, v2:$v2, rest:$rest"; done
v1:foo, v2:bar, rest:baz zab
$ echo "foo bar baz zab" | while read v1 v2 v3 rest; do echo "v1:$v1, v2:$v2, v3:$v3, rest:$rest"; done
v1:foo, v2:bar, v3:baz, rest:zab
Como você pode ver acima, a linha de entrada é dividida em quantas variáveis você fornecer. Quando há menos nomes de variáveis do que "palavras" na entrada, a última variável obtém o resto da linha. Isso é exatamente o mesmo ao ler um arquivo.
Em seguida, as variáveis são definidas usando var="foo"
e são lidas usando $var
. Então, não, seu professor estava certo, você não quer o $
quando a variável está sendo definida. Portanto, while read var
está correto e while read $var
está errado.
Então, uma versão funcional do seu script, usando a mesma lógica, seria:
find . -user $1 | grep $2 >temp
while read lig
do
echo $lig "nombre de ligne" 'wc -l < $lig'
done < temp
rm temp
Observe que removi o temp
do read
e o $
do final da linha echo
. Eu não tenho idéia porque você colocou isso lá.
Uma versão melhorada do seu script, com suas variáveis corretamente citadas , usando find
para encontrar as palavras-chave relevantes arquivos em vez de tentar analisar e sem arquivos temporários desnecessários seria:
find . -user "$1" -name "*$2*" |
## No need for a temp file, just pipe the output directly
## to the while loop
while read lig
do
echo "$lig nombre de ligne: $(wc -l < "$lig")"
done
Finalmente, uma abordagem verdadeiramente robusta que, ao contrário do que foi dito acima, pode lidar com nomes de arquivos arbitrários, incluindo aqueles com espaço em branco ou outros caracteres estranhos:
find . -user "$1" -name "*$2*" -print0 |
## No need for a temp file, just pipe the output directly
## to the while loop
while IFS= read -r -d '' lig
do
echo "$lig nombre de ligne: $(wc -l < "$lig")"
done