En guise de complément tardif aux réponses précédentes, vous vous retrouvez probablement dans des situations où vous voulez un peu de mais pas tous variables à interpoler. Vous pouvez résoudre ce problème en utilisant des barres obliques inversées pour échapper aux signes de dollar et aux barres obliques inversées, ou vous pouvez placer le texte statique dans une variable.
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
Démonstration : https://ideone.com/rMF2XA
Notez que tous les mécanismes de citation -- \____HERE
o "____HERE"
o '____HERE'
-- désactivera toute interpolation de variables, et transformera le document ici en un morceau de texte littéral.
Une tâche courante consiste à combiner des variables locales avec script qui doit être évalué par un shell différent, un langage de programmation ou un hôte distant.
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"
:
9 votes
C'est une confusion compréhensible ! Comme indiqué ci-dessous, le fait de citer n'importe quelle partie du délimiteur désactive l'expansion dans le hérédoc (comme s'il s'agissait de
''
), mais no La citation d'un sépar sépar séparateur active l'expansion (comme s'il s'agissait d'un sépar sépar séparateur dans le de l'expansion).""
). Cependant, votre intuition est correcte en Perl, où un heredoc avec un identifiant entre guillemets simples se comporte comme s'il était entre guillemets simples, un avec un identifiant entre guillemets doubles comme s'il était entre guillemets doubles, et un avec un identifiant entre guillemets arrière comme s'il était entre guillemets arrière ! Voir : perlop : <<EOF