web-dev-qa-db-fra.com

Shell - Ecrit le contenu d'une variable dans un fichier

Je voudrais copier le contenu d'une variable (appelée ici var) dans un fichier.

Le nom du fichier est stocké dans une autre variable destfile.

J'ai du mal à faire ça. Voici ce que j'ai essayé:

cp $var $destfile

J'ai également essayé la même chose avec la commande dd ... De toute évidence, le Shell pensait que $var faisait référence à un répertoire et m'a donc dit que ce répertoire était introuvable.

Comment puis-je contourner cela?

74
user1546083

Utilisez la commande echo:

var="text to append";
destdir=/some/directory/path/filename

if [ -f "$destdir" ]
then 
    echo "$var" > "$destdir"
fi

La 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 de $var au contenu du fichier existant, utilisez plutôt >>:

echo "$var" >> "$destdir"

La commande cp est utilisée pour copier des fichiers (dans des fichiers) et non pour écrire du texte dans un fichier.

108
pb2q

echo a le problème que si var contient quelque chose comme -e, il sera interprété comme un indicateur. Une autre option est printf, mais printf "$var" > "$destdir" étendra tous les caractères échappés de la variable. Ainsi, si la variable contient des barres obliques inverses, le contenu du fichier ne correspondra pas. Cependant, étant donné que printf interprète uniquement les barres obliques inverses comme des échappements dans la chaîne de format, vous pouvez utiliser le spécificateur de format %s pour stocker le contenu exact de la variable dans le fichier de destination:

printf "%s" "$var" > "$destdir"

21
Trebawa

Aucune des réponses ci-dessus ne fonctionne si votre variable:

  • commence par -e
  • commence par -n
  • commence par -E
  • contient un \ suivi d'un n
  • ne pas ajouter de nouvelle ligne après

et donc ils ne peuvent pas être invoqués pour des contenus de chaîne arbitraires.

En bash, vous pouvez utiliser "ici des chaînes" comme:

cat <<< "$var" > "$destdir"
14
Eric

Si je vous ai bien compris, vous voulez copier $var dans un fichier (s’il s’agit d’une chaîne).

echo $var > $destdir
8
qwertz

Lorsque vous dites "copier le contenu d'une variable", cette variable contient-elle un nom de fichier ou contient-elle le nom d'un fichier?

Par votre question, je suppose que $var contient le conten que vous voulez copier dans le fichier:

$ echo "$var" > "$destdir"

Cela fera écho à la valeur de $ var dans un fichier appelé $ destdir. Notez les citations. Très important d'avoir "$ var" entre guillemets. Aussi pour "$ destdir" s'il y a un espace dans le nom. Pour l'ajouter:

$ echo "$var" >> "$destdir"
0
David W.