Passer une variable à un script bash qui utilise 'EOF' et considère la variable comme un littéral [fermé]

9

dans ce script, je me retrouve avec "$ 1" en cours d'enregistrement dans le fichier / test.

#!/bin/bash
cat > /test << 'EOF'
$1
EOF

la vérité est .. je dois garder

'EOF'

comme 'EOF' parce que mon argument (1 $) contient des signes dollar.

mais j'ai besoin que cet argument soit sauvegardé plutôt que 1 $

user72685
la source
1
'parce que mon argument ( $1) contient des signes dollar.' Pas s'il fait référence au premier paramètre de ligne de commande. La substitution a été effectuée avant l'exécution de votre script. Vous devez y échapper sur la ligne de commande.
goldilocks
Vous avez posé plusieurs questions connexes sur cette tâche que vous effectuez, et la progression des questions montre que vous ne comprenez pas vraiment ce qui se passe et que vous ne choisissez probablement pas l'approche la plus simple. Il est difficile de vous aider sans savoir ce que vous essayez de faire, donc je vous recommande de poser une question où vous expliquez clairement votre tâche globale et de ne pas contraindre les réponses à utiliser un outil particulier. Par exemple, ne dites pas «Je veux utiliser catet conserver les signes dollar», mais «Je veux modifier le httpd.confpour changer <un paramètre> de <cette manière>».
Gilles 'SO- arrête d'être méchant'
@ Gilles, j'ai finalement décidé d'écrire dans un fichier différent via python, puis d'utiliser un script bash pour écrire ce fichier dans le fichier d'origine qui a été modifié. ce processus est beaucoup plus facile. cat / temp_file> 1 $
user72685
@Gilles, la raison pour laquelle mes questions n'ont pas de sens est que la façon dont les scripts bash traitent les variables qui leur sont transmises. il y a trop de choses à échapper et pourtant il n'y a pas de fonction pour encoder et décoder à la volée.
user72685
@Gilles, la seule chose qui avait un sens pour moi était un peu en base64 mais pourquoi faut-il coder leurs trucs pour passer à un script bash .. échapper des choses puis essayer de reconstruire des choses dans le script bash .. les trois barres obliques entières pour échapper à un backtick et etc. cela me semble un enfer de code
user72685

Réponses:

15

Pour donner suite à votre question précédente , il semble que vous souhaitiez à la fois du texte non interprété et du texte interprété dans un fichier. Dans ce cas, utilisez deux cats (ou echos) différents:

cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF

Il y a quelques choses qui se passent ici: premièrement, la syntaxe heredoc avec <<. Si vous incluez des guillemets dans cette chaîne de terminaison, comme dans la première ci-dessus, l'hérédoc entier n'est pas interprété - pas de paramètres et pas de substitutions. Si vous n'utilisez pas de guillemets, comme dans la seconde cat ci-dessus, les variables comme $1seront remplacées par leurs valeurs et les substitutions de commandes seront incluses dans le texte. Vous choisissez entre citer la chaîne "EOF" ou non selon que vous voulez ou non des substitutions.

Pour mettre les deux cats dans le même fichier, nous utilisons la >> redirection pour les deuxièmes (et plus tard) redirections: cela signifie ajouter au fichier. Pour le premier, nous utilisons un seul >pour effacer le fichier et recommencer à zéro.

Notez que, même lorsque des variables sont substituées , tous les signes dollar supplémentaires dans la valeur de cette variable ne sont pas eux-mêmes remplacés de nouveau:

foo='$bar'
bar=hello
cat <<EOF
$foo
EOF

affichera:

$bar

sans y substituer de $barvaleur.

Cependant, si vous fournissez un "$" dans l'argument de tout ce script, vous devez l'échapper sur la ligne de commande ou mettre le tout entre guillemets simples. Alternativement, la substitution de commandes comme dans votre autre question vous permet de mettre directement le contenu d'un fichier entier, y compris les signes dollar dans le contenu du fichier. Assurez-vous de citer la chaîne de substitution ici:

oo.sh "$(cat myfile)"

obtiendra le corps de myfileas $1et pourra ensuite catou echoselon les besoins. Les mêmes limites que dans ma réponse s'appliquent: il y a une limite pour la durée des arguments de ligne de commande, et si votre fichier peut devenir plus long que cela, vous devriez trouver une autre approche. Vous pouvez découvrir quelle est la limite de votre système avecgetconf ARG_MAX

Michael Homer
la source
1

On dirait que vous voulez simplement sortir la variable dans le fichier. Dans ce cas, cela fonctionnera:

echo $1 >/test

Notez qu'il se /testtrouve dans le répertoire racine, pour lequel les utilisateurs ordinaires n'ont généralement pas de droit d'écriture.

EDIT: Gardez à l'esprit que vous devez citer la chaîne contenant le signe dollar dans la ligne de commande . C'est là que la substitution se produit, et le script ne peut rien y faire après coup.

Tom Zych
la source
Je pense que vous avez la bonne réponse maintenant. +1
goldilocks
@ La réponse de MichaelHomer est beaucoup plus complète et comprend des informations utiles sur les documents que j'avais oubliés. Sa réponse devrait être acceptée (à moins que quelqu'un d'autre n'en poste une encore meilleure, bien sûr).
Tom Zych