Назначение не удаляет символы новой строки, это на самом деле echo
делает это. Вам нужно просто поместить кавычки вокруг строки, чтобы сохранить эти новые строки:
echo "$testvar"
Это даст желаемый результат. Смотрите следующую стенограмму для демонстрации:
pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2
pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2
Причина , почему символы новой строки заменяются пробелами, не целиком связана с командой echo
, скорее это комбинация вещей.
Когда передается командная строка, bash
разбивает ее на слова в соответствии с документацией для переменной IFS
:
IFS: Внутренний разделитель полей, который используется для разделения слов после раскрытия ... по умолчанию установлено значение <space><tab><newline>
.
Указывает, что по умолчанию любой из этих трех символов может использоваться для разделения вашей команды на отдельные слова. После этого разделители слов исчезли, все, что у вас осталось, это список слов.
Объедините это с документацией echo
(внутренняя команда bash
), и вы поймете, почему выводятся пробелы:
echo [-neE] [arg ...]: Вывести аргументы, разделенные пробелами, с последующим переводом строки.
Когда вы используете echo "$x"
, она заставляет всю переменную x
быть одиночным словом в соответствии с bash
, следовательно, она не разделяется. Вы можете увидеть это с помощью:
pax> function count {
...> echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1
Здесь функция count
просто выводит количество аргументов. Варианты 1 2 3
и a b c d
показывают его в действии.
Затем мы попробуем это с двумя вариантами переменной x
. Один без кавычек показывает, что есть четыре слова: "test"
, "1"
, "test"
и "2"
. Добавление кавычек делает его одно одно слово "test 1\ntest 2"
.