Как читать полную строку в цикле «за» с пробелами

72

Я пытаюсь запустить цикл for для файла, и я хочу отобразить всю строку. Но вместо этого он отображает только последнее слово. Я хочу полную строку.

for j in 'cat ./file_wget_med'

do
echo $j

done

результат после запуска:

Found.

Вот мои данные:

$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
    
задан user192118 11.09.2013 в 21:49
источник

3 ответа

112
Цикл

for разбивается, когда он видит любые пробелы, такие как пробел, табуляция или новая строка. Таким образом, вы должны использовать IFS (внутренний разделитель полей) :

IFS=$'\n'       # make newlines the only separator
for j in $(cat ./file_wget_med)    
do
    echo "$j"
done
    
ответ дан Radu Rădeanu 11.09.2013 в 22:26
62

for циклов разбиты по любым пробелам (пробел, табуляция, новая строка) по умолчанию; самый простой способ работы с одной линией в то время - использовать вместо этого цикл while read , который разбивается на строки новой строки:

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

Я бы ожидал вашу команду, чтобы выплюнуть одно слово в строке (это произошло, когда я проверил его с собственным файлом). Если что-то еще происходит, я не уверен, что может вызвать его.

    
ответ дан evilsoup 11.09.2013 в 22:04
10
#!/bin/bash
files='find <subdir> -name '*''
while read -r fname; do
    echo $fname
done <<< "$files"

Проверенная работа, а не тот, который вы, возможно, хотите, но это невозможно сделать элегантно.

    
ответ дан Mitchell Currie 02.11.2016 в 07:34