Aucune des réponses ci-dessus ne fonctionne si votre variable :
- commence par
-e
- commence par
-n
- commence par
-E
- contient un
\
suivi d'unn
- ne devrait pas avoir de saut de ligne supplémentaire ajouté après
et donc ils ne peuvent pas être invoqués pour un contenu de chaîne arbitraire.
En bash, vous pouvez utiliser "here strings" comme :
cat <<< "$var" > "$destdir"
Comme indiqué dans le commentaire de Ash ci-dessous, la réponse de @ Trebawa (formulée dans la même pièce que la mienne !) en utilisant printf
est une meilleure approche que cat
.
Tout ce qui précède fonctionne, mais doit également contourner un problème (échappements et caractères spéciaux) qui n'a pas besoin de se produire en premier lieu :les caractères spéciaux lorsque la variable est développée par le shell. Ne faites pas cela (expansion variable) en premier lieu. Utilisez la variable directement, sans expansion.
De plus, si votre variable contient un secret et que vous souhaitez copier ce secret dans un fichier, vous souhaiterez peut-être ne pas avoir d'expansion dans la ligne de commande car le traçage/écho de commande des commandes shell pourrait révéler le secret. Signifie, toutes les réponses qui utilisent $var
dans la ligne de commande peut présenter un risque de sécurité potentiel en exposant le contenu de la variable au traçage et à la journalisation du shell.
Pour les variables déjà exportées, utilisez ceci :
printenv var >file
Cela signifie, en cas de question OP :
printenv var >"$destfile"
Remarque :les noms de variables sont sensibles à la casse.
Avertissement :Ce n'est pas une bonne idée d'exporter une variable juste pour l'imprimer avec printenv. Si vous avez une variable de script non exportée qui contient un secret, l'exporter l'exposera à tous les futurs processus enfants (sauf s'il n'est pas exporté, par exemple en utilisant export -n
).
Utilisez le echo
commande :
var="text to append";
destdir=/some/directory/path/filename
if [ -f "$destdir" ]
then
echo "$var" > "$destdir"
fi
Le if
teste que $destdir
représente un fichier.
Le >
ajoute le texte après avoir tronqué le fichier. Si vous souhaitez uniquement ajouter le texte en $var
au contenu existant du fichier, puis utilisez >>
à la place :
echo "$var" >> "$destdir"
Le cp
La commande est utilisée pour copier des fichiers (dans des fichiers), pas pour écrire du texte dans un fichier.
echo
a le problème que si var
contient quelque chose comme -e
, il sera interprété comme un drapeau. Une autre option est printf
, mais printf "$var" > "$destdir"
développera tous les caractères échappés dans la variable, donc si la variable contient des barres obliques inverses, le contenu du fichier ne correspondra pas. Cependant, parce que printf
interprète uniquement les barres obliques inverses comme des échappements dans la chaîne de format, vous pouvez utiliser le %s
spécificateur de format pour stocker le contenu exact de la variable dans le fichier de destination :
printf "%s" "$var" > "$destdir"