У меня есть текстовый файл test.txt со следующим содержанием:
text1
text2
И я хочу присвоить содержание файла к переменной UNIX, но когда я делаю это:
testvar=$(cat test.txt)
echo $testvar
результат:
text1 text2
вместо
text1
text2
Кто-то может предложить меня решение для этого?
Назначение не удаляет символы новой строки, это фактически эхо
] делая это. Вам нужно просто заключить строку в кавычки, чтобы сохранить эти символы новой строки:
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: Используемый внутренний разделитель полей для разделения слов после раскрытия ... значение по умолчанию
<пробел> <вкладка> <новая строка>
.
Это означает, что по умолчанию любой из этих трех символов может использоваться для разделения вашей команды на отдельные слова. После этого разделители слов исчезли, все, что у вас осталось, - это список слов.
Объедините это с документацией 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
. Один без кавычек показывает, что есть четыре слова: «тест»
, «1»
, «тест»
и «2»
. Добавление кавычек делает его одним отдельным словом «тест 1 \ n тест 2»
.
Bash -ge 4 имеет встроенный mapfile для чтения строк из стандарта ввод в переменную массива.
help mapfile
mapfile < file.txt lines
printf "%s" "${lines[@]}"
mapfile -t < file.txt lines # strip trailing newlines
printf "%s\n" "${lines[@]}"
См. Также:
http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile
Это связано с переменной IFS (внутренний разделитель полей) , которая содержит новую строку.
$ cat xx1
1
2
$ A=`cat xx1`
$ echo $A
1 2
$ echo "|$IFS|"
|
|
Временное решение - сбросить IFS, чтобы временно не содержать новую строку :
$ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK
Чтобы ОТМЕНИТЬ это ужасное изменение для IFS:
IFS=$IFSBAK