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 cat
s (ou echo
s) 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 $1
seront 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 cat
s 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 $bar
valeur.
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 myfile
as $1
et pourra ensuite cat
ou echo
selon 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
$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.