У меня есть эта многострочная строка (цитаты включены):
abc'asdf"
$(dont-execute-this)
foo"bar"''
Как бы я назначил его переменной, используя heredoc в Bash?
Мне нужно сохранить переводы строк.
Я не хочу избегать символов в строке, это будет раздражать ...
'EOF'
, с экранированными` in the content: if the second line has
переносами строк с помощью команды cd`, я получаю ответ: " .sh: line X: cd: команда не найдена "; но если я приведу двойные кавычки"EOF"
; тогда переменные bash${A}
не сохраняются как строки (они раскрываются); но затем, линия-брейки будут сохранены - и я не имею проблемы запуска команды сcd
во второй строке ( и как «EOF» и «EOF» , кажется, играют хорошо и сeval
, для выполнения набора команд , хранящихся в строковая переменная ). Ура!"EOF"
переменной с двойным кавычкой , еслиeval $VAR
вызывается через , приведет к тому, что весь остальной сценарий будет закомментирован, так как здесь $ VAR будет рассматриваться как одна строка ; чтобы иметь возможность использовать#
комментарии bash в многострочном скрипте, используйте двойные кавычки и переменную в переменнойeval call:
«$ VAR» `.eval
этими методами, но я не отслеживал его, поскольку он был частью некоторого пакета, в которомeval
некоторые переменные определены в его конфигурационном файле. Сообщение об ошибке было:/usr/lib/network/network: eval: line 153: syntax error: unexpected end of file
. Я просто переключился на другое решение.Ответы:
Вы можете избежать бесполезного использования
cat
и лучше обрабатывать несовпадающие кавычки:Если вы не заключаете в кавычки переменную, когда вы выводите ее, новые строки теряются. Цитируя это сохраняет их:
Если вы хотите использовать отступ для удобства чтения в исходном коде, используйте тире после менее чем. Отступы должны быть сделаны с использованием только табуляции (без пробелов).
Если вместо этого вы хотите сохранить вкладки в содержимом результирующей переменной, вам нужно удалить вкладку из
IFS
. Маркер терминала для здесь doc (EOF
) не должен иметь отступ.Вкладки могут быть вставлены в командной строке, нажав Ctrl- V Tab. Если вы используете редактор, в зависимости от того, какой из них может также работать, или вам может потребоваться отключить функцию, которая автоматически преобразует вкладки в пробелы.
источник
set -o errexit
(акаset -e
) в вашем скрипте, и вы используете это, то он прервет ваш скрипт, потому чтоread
возвращает ненулевой код возврата, когда он достигает EOF.set -e
и всегда рекомендую против ее использования. Вместо этого лучше использовать правильную обработку ошибок.trap
твой друг. Другие друзья:else
и||
среди других.cat
этого в таком случае? Присвоение heredoc переменной сcat
помощью хорошо известной идиомы. Каким-то образом использованиеread
запутывает вещи для небольших выгод imho.d
пустой строкой;bash
рушится-rd''
просто-rd
до того, какread
увидит свои аргументы, поэтомуVAR
рассматривается как аргумент-d
.read
вернется с ненулевым кодом выхода. Это делает этот метод менее чем идеальным в скрипте с включенной проверкой ошибок (напримерset -e
).Используйте $ (), чтобы назначить вывод
cat
вашей переменной следующим образом:Не забудьте ограничить начало END_HEREDOC одинарными кавычками.
Обратите внимание, что конечный разделитель heredoc
END_HEREDOC
должен быть один в строке (следовательно, конечная скобка находится на следующей строке).Спасибо
@ephemient
за ответ.источник
echo "$VAR"
вместоecho $VAR
.ash
OpenWRT, гдеread
не поддерживается-d
.это вариант метода Денниса, выглядит более элегантно в сценариях.
определение функции:
Применение:
наслаждаться
PS сделал версию 'цикла чтения' для оболочек, которые не поддерживают
read -d
. должны работать сset -eu
и непарных обратные кавычки , но не протестированы очень хорошо:источник
read
цикл в функции, чтобы избежать-d ''
bashism, необходимого для сохранения новых строк).set -e
множеством, а выбранный ответ - нет. Похоже, что из-заhttp://unix.stackexchange.com/a/265151/20650
не работает, потому что вы перенаправляете stdin на что-то, что не заботится об этом, а именно на назначение
работает, но есть обратный тик, который может помешать вам использовать это. Кроме того, вам следует избегать использования обратных галочек, лучше использовать обозначение подстановки команд
$(..)
.источник
$(cat <<'END'
вместо этого. @Neil: самый последний символ новой строки не будет частью переменной, но остальное будет сохранено.echo "$A"
(то есть помещая $ A в двойные кавычки), и вы видите новые строки!REM=<< 'REM' ... comment block goes here ... REM
. Или более компактно: << 'REM' ...
. Где «REM» может быть чем-то вроде «NOTES» или «SCRATCHPAD» и т. Д.Это неправда - вы, вероятно, просто введены в заблуждение поведением echo:
echo $VAR # strips newlines
echo "$VAR" # preserves newlines
источник
Ветвление от ответа Нила , вы часто не нужен вар на всех, вы можете использовать функцию во многом таким же образом , как переменные , и это гораздо легче читать , чем инлайн или
read
-Ы решения.источник
Массив является переменной, поэтому в этом случае будет работать mapfile
Тогда вы можете напечатать так
источник
присвоить значение heredoc переменной
используется в качестве аргумента команды
источник
echo "$VAR"
Я обнаружил, что должен прочитать строку с NULL, так что вот решение, которое будет читать все, что вы в нее бросаете. Хотя, если вы на самом деле имеете дело с NULL, вам придется иметь дело с этим на шестнадцатеричном уровне.
$ cat> read.dd.sh
Доказательство:
Пример HEREDOC (с ^ J, ^ M, ^ I):
источник
Благодаря ответу dimo414 , это показывает, как работает его отличное решение, и показывает, что в тексте также можно легко использовать кавычки и переменные:
пример вывода
test.sh
источник
источник