419 votes

Comment affecter une valeur heredoc à une variable dans Bash?

J’ai cette chaîne multiligne (guillemets inclus)

Comment aurait elle assigner à une variable en utilisant une syntaxe heredoc dans Bash ?

Il n’y a toujours aucun solution qui préserve les retours à la ligne.

Je ne veux pas échapper les caractères dans la chaîne, ce qui serait gênant...

576voto

Dennis Williamson Points 105818

Vous pouvez éviter une inutile l'utilisation d' cat et poignée incompatibles citations mieux avec ceci:

$ read -r -d '' VAR <<'EOF'
abc'asdf"
$(dont-execute-this)
foo"bar"''
EOF

Si vous ne citez pas la variable lorsque vous l'écho, les retours à la ligne sont perdues. Citant les conserve:

$ echo "$VAR"
abc'asdf"
$(dont-execute-this)
foo"bar"''

Si vous souhaitez utiliser l'indentation pour des raisons de lisibilité dans le code source, utilisez un tiret après le moins thans. Le retrait doit être fait en utilisant uniquement les onglets (pas d'espaces).

$ read -r -d '' VAR <<-'EOF'
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''
    EOF
$ echo "$VAR"
abc'asdf"
$(dont-execute-this)
foo"bar"''

Si, au lieu de cela, vous voulez préserver les onglets dans le contenu de la variable qui en découle, vous devez supprimer l'onglet de IFS. Le terminal de marqueur pour la doc ici (EOF) ne doit pas être en retrait.

$ IFS='' read -r -d '' VAR <<'EOF'
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''
EOF
$ echo "$VAR"
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''

Les onglets peuvent être insérés dans la ligne de commande en appuyant sur Ctrl-V Tab. Si vous utilisez un éditeur, en fonction de celui qui, qui peut également fonctionner ou vous devrez peut-être désactiver la fonction qui convertit automatiquement les tabulations en espaces.

301voto

Neil Points 5343

$() Permet d’affecter la sortie de `` à votre variable comme ceci :

En veillant à délimiter des END_HEREDOC avec des guillemets simples.

Merci à `` pour la réponse.

85voto

ttt Points 321

C’est la variation de la méthode de Dennis, semble plus élégant dans les scripts.

définition de la fonction :

utilisation :

Profitez de

42voto

l0st3d Points 1071
<pre><code></code><p>ne fonctionne pas parce que vous redirigez stdin à quelque chose qui ne s’inquiète pas à ce sujet, à savoir l’affectation</p><pre><code></code></pre><p><code></code>.</p><pre><code></code></pre></pre>

38voto

patspam Points 231

Ajouter commentaire ici comme une réponse puisque je n’ai pas assez de points de rep à commenter votre texte de la question.

Il n’y a toujours aucun solution qui préserve les retours à la ligne.

Ce n’est pas vrai - vous n’êtes probablement juste soient induits en erreur par le comportement d’echo :

``

``

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X