Estou tentando executar um for
loop para o arquivo e quero exibir a linha inteira. Mas, em vez disso, está exibindo 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.
command-line
bash
scripts
user192118
fonte
fonte
Respostas:
for
O loop é dividido quando vê qualquer espaço em branco, como espaço, tabulação ou nova linha. Portanto, você deve usar o IFS (Internal Field Separator) :fonte
unset IFS
depois, para que outros comandos não sejam influenciados nesse mesmo shell.$
significa issoIFS=$'\n'
?$
faz quebras de linha funcionem dentro da string. Isso também deve ser feito comlocal IFS=$'\n'
dentro de uma função.$'...'
conhecido " ANSI-Cfor
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 umwhile read
loop, que se divide em novas linhas:Eu esperaria que seu comando cuspisse uma palavra por linha (foi o que aconteceu quando eu testei com um arquivo próprio). Se algo mais estiver acontecendo, não sei ao certo o que poderia estar causando isso.
fonte
for i in `ls`; do echo $1; done
, canalizando a saída para o comando while:ls|while read i; do echo $i; done
. Isso funciona em nomes de arquivos / pastas com espaços, sem a necessidade de alterar variáveis de ambiente. Resposta muito boa.ls
não é considerado seguro para uso com|
(o operador do tubo).find
é mais flexível, além de ser mais seguro para essa finalidade.pbpaste | while read t; do echo "<string>$t</string>"; done
ls -1
pode ser usado com|
a garantia de saída formatado linha um-por-Funcionamento verificado, não aquele que você provavelmente deseja, mas não é possível fazê-lo com elegância.
fonte
Aqui está uma pequena extensão da resposta de Mitchell Currie, que eu gosto por causa do pequeno escopo de efeitos colaterais, que evita a necessidade de definir uma variável:
fonte
-name '*'
e seria o mesmo, não?Eu escreveria assim:
pois requer menos alterações no script original (exceto pela solução em uso
IFS
, mas modifica obash
comportamento não apenas para esta instrução de controle de loop).fonte
cat
são desnecessários aqui.while
loop aceita redirecionamento muito bem, e é por isso que geralmente é escrito como #while IFS= read -r line; do...done < input.txt
O Mapfile é uma maneira conveniente de ler linhas de um arquivo em uma matriz indexada, não tão portátil quanto a leitura, mas um pouco mais rápido. Ao usar o loop for, você evita criar um subshell.
Lembre-se de que ao usar pipelines, ele colocará o loop while em um subshell. Alterações dentro das variáveis do loop while não serão propagadas para a parte externa do script.
Exemplo:
(Melhor solução):
fonte
Dandalf chegou bem perto de uma solução funcional, mas NUNCA se deve tentar atribuir o resultado de quantidades desconhecidas de entrada (ou seja
find ~/.gdfuse -name '*'
) a variáveis! Ou, pelo menos, tentando fazer isso através de uma variável de matriz; se você insiste em ser tão preguiçoso! Então, aqui está a solução de Dandalf feita sem a manobra perigosa; e no total em uma linhafonte