Ответ 1
Рассмотрим следующую многострочную переменную
x=$(echo -e "a\nb\nc d e")
и простой процесс для каждой строки: просто echo
с префиксом = LINE:
и одинарными кавычками вокруг строки. Любой из следующих кодов удовлетворит это требование:
while read line; do echo "LINE: '${line}'"; done <<< "$x"
или
while read line; do echo "LINE: '${line}'"; done < <(echo "$x")
Ни один из них не создает подоболочку (так что вы можете, например, устанавливать переменные в цикле и получать к ним доступ вне его), и оба вывода
LINE: 'a'
LINE: 'b'
LINE: 'c d e'
Но предположим, что вместо этого у вас есть
x=$(echo -e "a \n b\nc d e")
# note--------^--^
и что начальные и конечные пробелы важны для вашего приложения (например, анализ Git-фарфора). Оба приведенных выше кода будут давать точно такой же вывод для последней переменной/данных, что и для первой, что не является тем, что вам нужно. Чтобы сохранить начальные и конечные пробелы, замените while read line
на while IFS= read -r line
. Т.е. любой из следующих кодов
while IFS= read -r line; do echo "LINE: '${line}'"; done <<< "$x"
или
while IFS= read -r line; do echo "LINE: '${line}'"; done < <(echo "$x")
произведет
LINE: 'a '
LINE: ' b'
LINE: 'c d e'
Подробности смотрите в Greg Wooledge - превосходном Bash FAQ.