Как поздний вывод из предыдущих ответов, вы, вероятно, окажетесь в ситуациях, когда вы хотите, чтобы некоторые, но не все переменные были интерполированы. Вы можете решить эту проблему, используя обратную косую черту, чтобы избежать знаков доллара и обратных кавычек; или вы можете поместить статический текст в переменную.
Name='Rich Ba$tard'
dough='$$$dollars$$$'
cat <<____HERE
$Name, you can win a lot of $dough this week!
Notice that \`backticks' need escaping if you want
literal text, not `pwd`, just like in variables like
\$HOME (current value: $HOME)
____HERE
Демо: https://ideone.com/rMF2XA
Обратите внимание, что любой из механизмов цитирования - \____HERE
или "____HERE"
или '____HERE'
- отключит интерполяцию всех переменных и превратит документ здесь в фрагмент буквального текста.
Обычной задачей является объединение локальных переменных со скриптом, который должен оцениваться другой оболочкой, языком программирования или удаленным хостом.
local=$(uname)
ssh -t remote <<:
echo "$local is the value from the host which ran the ssh command"
# Prevent here doc from expanding locally; remote won't see backslash
remote=\$(uname)
# Same here
echo "\$remote is the value from the host we ssh:ed to"
:
''
), но не цитирование разделителя включает расширение (как если бы оно было""
). Тем не менее, ваша интуиция верна в Perl, где heredoc с идентификатором в одинарных кавычках ведет себя так, как если бы он был в одинарных кавычках, один с идентификатором в двойных кавычках, как будто в двойных кавычках, и один с идентификатором в обратном тиканье, как будто в обратных галочках ! Смотрите: perlop: << EOF