Содержание файла в переменную Unix с новыми строками

У меня есть текстовый файл test.txt со следующим содержанием:

text1
text2 

И я хочу присвоить содержание файла к переменной UNIX, но когда я делаю это:

testvar=$(cat test.txt)
echo $testvar

результат:

text1 text2

вместо

text1
text2 

Кто-то может предложить меня решение для этого?

96
задан Benjamin W. 23 April 2016 в 03:25
поделиться

3 ответа

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

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» .

156
ответ дан 24 November 2019 в 05:38
поделиться

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

9
ответ дан 24 November 2019 в 05:38
поделиться

Это связано с переменной 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
9
ответ дан 24 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: