Как добавить данные в переменную с помощью \ n в качестве разделителя?

Кажется, что новые линейные символы потеряны, хотя они появляются в кавычках.

foo= for i in 1 2 3; do foo="$foo$(printf '\n')$i" done echo "$foo" 123 

Теперь на практике я не хочу добавлять \n до первого элемента, поэтому я бы использовал вместо ${foo:+$(printf '\n')} , но сначала мне нужно выяснить, почему код выше не работает.

2 Solutions collect form web for “Как добавить данные в переменную с помощью \ n в качестве разделителя?”

Подстановка команд удаляет конечные символы новой строки, поэтому $(printf '\n') – это то же самое, что и $(printf '\n\n\n\n') , а именно пустая строка.

Чтобы включить новую строку в строку, поставьте ее в виде одиночных или двойных кавычек.

 for i in 1 2 3; do foo="$foo $i" done 

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

 nl=' ' for i in 1 2 3; do foo="$foo$nl$i" done 

В ksh93, bash, FreeBSD sh, mksh и zsh, но не просто sh (пока), вы также можете использовать долларовую одиночную кавычку, которая позволяет использовать обратную косую черту.

 for i in 1 2 3; do foo="$foo"$'\n'"$i" done 

Да, символы новой строки были потеряны, Command Substitution съел их:

Оболочка должна расширять подстановку команд, выполняя команду в среде подсетей (см. Shell Execution Environment) и заменяя подстановку команд (текст команды плюс прилагаемый «$ ()» или backquotes) со стандартным выводом команды, удаляя последовательности одного или нескольких символов <newline> в конце подстановки

Вам не нужен цикл for , просто:

 foo=$(printf '%s\n' 1 2 3) 
  • Как создать постоянное клиентское соединение с netcat?
  • Проверьте, установлены ли все перечисленные пакеты в bash
  • лучшее использование find - rvm.sh
  • Запустите wc и покажите только количество слов
  • «Нет такого файла» с ksh, но скрипт работает с ksh -x?
  • Как эффективно использовать GNU-параллель
  • Сканирование no: символов файла и запись его самого файла
  • Поплавковые операции с bc неточны?
  • bash добавление 1 к переменной в цикле while
  • Сообщение об ошибке на терминале, несмотря на использование символа 2>
  • Как проверить, какую оболочку я использую в терминале?
  • Interesting Posts

    Длительное время компиляции gcc

    Как вы помните последний (n-й?) Переданный аргумент предыдущей команды, которую вы использовали с bash?

    Как правильно запустить systemd?

    Большой разрыв в dmesg и медленная загрузка

    Можно ли использовать rsync для создания только жестких ссылок, а не копий?

    Покажите два настольных пейджера с различными настройками в KDE

    Как добавить пользовательские часы часового пояса на панель XFCE?

    Как вставить переменные bash в awk?

    Как настроить колесо мыши для прокрутки между окнами одной и той же группы?

    Динамически растущий файл подкачки на Debian

    как найти начальное местоположение изменяющейся подстроки в более длинной строке

    Как узнать, являются ли таинственные программы в списке нетонов вредоносными программами?

    Установка MongoDB в контейнере Ubuntu LXC. Сбой с 'invoke-rc.d: initscript mongod, действие "start" не выполнено.'

    Передача параметров Upstart

    Настройте BIND и DNSMasq для совместной работы на одной машине

    Linux и Unix - лучшая ОС в мире.