Присваивание не удаляет символы новой строки, это фактически 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"
.
Это связано с переменной IFS (внутренний разделитель полей), которая содержит новую строку.
Обходной путь - сбросить IFS, чтобы временно не содержать новую строку :
Чтобы ОТМЕНИТЬ это ужасное изменение для IFS:
источник
echo "$(IFS=''; cat text.txt)"
Bash -ge 4 имеет встроенный mapfile для чтения строк из стандартного ввода в переменную массива.
Смотрите также:
http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile
источник
Просто если кого-то интересует другой вариант:
источник
Ваша переменная установлена правильно
testvar=$(cat test.txt)
. Чтобы отобразить эту переменную, содержащую символы новой строки, просто добавьте двойные кавычки, напримерВот полный пример:
источник
envdir
Утилита предоставляет простой способ сделать это.envdir
использует файлы для представления переменных среды, с сопоставлением имен файлов с именами env var и сопоставлением содержимого файла со значениями env var. Если содержимое файла содержит символы новой строки, то env var.См. Https://pypi.python.org/pypi/envdir
источник