Come leggere la riga completa nel ciclo 'for' con spazi

91

Sto cercando di eseguire un ciclo for per file e voglio visualizzare l'intera riga. Ma invece sta visualizzando solo l'ultima parola. Voglio la linea completa.

for j in 'cat ./file_wget_med'

do
echo $j

done

risultato dopo l'esecuzione:

Found.

Ecco i miei dati:

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

4 risposte

131
Il ciclo

for si divide quando vede spazi bianchi come spazi, tabulazioni o newline. Quindi, dovresti usare IFS (Internal Field Separator) :

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

for loop suddiviso su qualsiasi spazio bianco (spazio, tab, newline) per impostazione predefinita; il modo più semplice per lavorare su una riga alla volta è utilizzare invece un ciclo while read , che si divide sulle nuove linee:

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

Vorrei aspettarmi il tuo comando per sputare una parola per riga (è quello che è successo quando l'ho testato con un mio file). Se succede qualcos'altro, non sono sicuro di cosa potrebbe causarlo.

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

Lavoro verificato, non quello che probabilmente vuoi, ma non è possibile farlo con eleganza.

    
risposta data Mitchell Currie 02.11.2016 - 07:34
2

Ecco una leggera estensione alla risposta di Mitchell Currie, che mi piace a causa del piccolo ambito degli effetti collaterali, che evita di dover impostare una variabile:

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

Leggi altre domande sui tag