Como ler a linha completa no loop 'for' com espaços

81

Estou tentando executar um loop for para o arquivo e quero exibir toda a linha. Mas em vez disso, exibe apenas a última palavra. Eu quero a linha completa.

for j in 'cat ./file_wget_med'

do
echo $j

done

resultado após a execução:

Found.

Aqui estão os meus dados:

$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
    
por user192118 11.09.2013 / 21:49

4 respostas

124

for loop divide quando vê qualquer espaço em branco como espaço, tabulação ou nova linha. Então, você deve usar IFS (Internal Field Separator) :

IFS=$'\n'       # make newlines the only separator
for j in $(cat ./file_wget_med)    
do
    echo "$j"
done
    
por Radu Rădeanu 11.09.2013 / 22:26
65

for loops divididos em qualquer espaço em branco (espaço, tabulação, nova linha) por padrão; A maneira mais fácil de trabalhar em uma linha de cada vez é usar um while read loop, que divide em novas linhas:

while read i; do echo "$i"; done < ./file_wget_med

Eu esperaria o seu comando para cuspir uma palavra por linha (foi o que aconteceu quando eu testei com um arquivo meu). Se alguma coisa está acontecendo, não tenho certeza do que poderia estar causando isso.

    
por evilsoup 11.09.2013 / 22:04
13
#!/bin/bash
files='find <subdir> -name '*''
while read -r fname; do
    echo $fname
done <<< "$files"

Verificado a funcionar, não o forro que provavelmente quer, mas não é possível fazê-lo com elegância.

    
por Mitchell Currie 02.11.2016 / 07:34
0

Aqui está uma pequena extensão da resposta de Mitchell Currie, que eu gosto por causa do pequeno escopo de efeitos colaterais, que evita ter que definir uma variável:

#!/bin/bash
while read -r fname; do
    echo $fname
done <<< "'find <subdir> -name '*''"
    
por Dandalf 07.06.2018 / 17:57