web-dev-qa-db-fra.com

Comment puis-je écrire du texte dans un fichier en bash tout en conservant son contenu précédent?

J'ai essayé de créer un script Bash Shell qui créerait et modifierait un fichier appelé list. En réalité, mon objectif avec le programme est d’ajouter des noms à une liste, en créant le fichier avec un en-tête (si nécessaire).

Cependant, le script échoue actuellement à un moment donné: chaque fois que je le relance, l'ancien nom disparaît et est remplacé par le nom qui vient d'être entré. Comment puis-je résoudre ça?

Mon script:

#!/bin/bash
#Please sign your name here.

echo "Hi, what's your name?"
read name
echo "Hi $name, welcome to the Linux course!"

echo Course Attendees > list
echo $name >> list

Exemple de problème:

$ bash list.sh
Hi, what's your name?
Test
Hi Test, welcome to the Linux course!

$ cat list
Course Attendees
Test

$ bash list.sh
Hi, what's your name?
Test2
Hi Test, welcome to the Linux course!

$ cat list
Course Attendees
Test2
2
Mike02x

Dans Bash, il y a deux façons d'écrire dans un fichier (techniquement, il y en a beaucoup plus, mais pour ce qui est de cette réponse, il y en a deux):

Tout d’abord, l’opérateur >, que vous utilisez dans cette ligne:

echo Course Attendees > list

L'opérateur > va écraser tout élément existant dans le fichier avec le nouveau contenu du fichier. En effet, il supprime le fichier et en crée un nouveau portant le même nom.

Deuxièmement, il y a l'opérateur >>, utilisé ici:

echo $name >> list

Ceci ajoute des lignes à un fichier existant ou en crée un nouveau s'il n'existe pas .

Lorsque vous exécutez votre script, vous écrasez toujours votre liste de cours avec l'en-tête "Participants au cours", ce qui provoque cette erreur. Modifiez votre programme pour ajouter des lignes uniquement si l'en-tête "Participants au cours" est présent. Ma suggestion personnelle serait de vérifier si le fichier existe. Si tel est le cas, utilisez uniquement l'opération d'ajout. Sinon, donnez-lui l'en-tête et créez-le.

Ou, plus élégamment, exécutez uniquement echo Course Attendees > list si le fichier n'existe pas. Voir this SO answer pour plus d'informations sur comment exécuter une vérification comme celle-ci.

4
Kaz Wolfe