Script Bash – Comment écrire dans un nouveau fichier ou un fichier existant ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons apprendre à écrire dans un fichier dans un script Bash. Que ce soit pour stocker la sortie d'une commande, créer un fichier journal (log), stocker des données ou encore générer un rapport, il peut s'avérer utile d'être capable d'écrire dans un fichier.
Nous verrons comment utiliser les opérateurs de redirection de Bash, ainsi que la commande tee. Au travers différents exemples, nous allons apprendre à ajouter du texte à un nouveau fichier et à un fichier existant, à écraser son contenu, et à écrire du texte en s'appuyant sur des variables.
Pour rappel, voici le lien vers notre introduction au Bash :
II. Écrire du texte dans un fichier
Pour écrire du texte dans un fichier, vous pouvez utiliser l'opérateur de redirection ">". Cet opérateur permet de rediriger la sortie d'une commande vers un fichier, ou envoyer simplement du texte, en écrasant le contenu existant dans le fichier. Si le fichier n'existe pas, il sera créé.
Voici un premier exemple :
#!/bin/bash
echo "IT-Connect !" > sortie.txt
Dans cet exemple, le texte "IT-Connect !" est écrit dans un fichier nommé "sortie.txt". Si ce fichier n'existe pas, il sera créé. Si le fichier existe déjà, son contenu sera écrasé par notre texte.
Si vous voulez ajouter du texte à un fichier sans écraser son contenu, c'est-à-dire en écrivant à la suite du contenu déjà présent dans le fichier, vous devez utiliser l'opérateur de redirection ">>".
#!/bin/bash
echo "IT-Connect !" >> sortie.txt
L'image ci-dessous illustre bien la différence de comportement entre les opérateurs ">" et ">>".
III. Rediriger la sortie d'une commande dans un fichier
Nous avons vu comment écrire du texte dans un fichier à l'aide de deux redirecteurs différents. Sur le même principe, vous pouvez rediriger la sortie d'une commande dans un fichier. L'exemple ci-dessous stocke le résultat de la commande "ip a" (afficher la configuration IP des interfaces réseau) dans un fichier texte nommé "ip.txt".
ip a > ip.txt
Si nous affichons le contenu du fichier, il contient bien le résultat de la commande :
De la même façon, nous pouvons lire un fichier avec la commande cat et rediriger la sortie vers un autre fichier. Ceci permet de copier le contenu d'un fichier pour le stocker dans un autre fichier. Voici un exemple avec le fichier "/etc/hosts".
cat /etc/hosts > hosts.txt
Là encore, nous obtenons le résultat souhaité :
IV. Utiliser des variables pour écrire dans un fichier
Le texte que vous souhaitez écrire dans un fichier peut tout à fait contenir des variables. Ainsi, les valeurs des variables seront écrites dans le fichier. Voici un exemple très simple pour illustrer ce cas de figure. Ici, l'utilisateur doit saisir son prénom, puis ce prénom est écrit dans un fichier.
#!/bin/bash
echo "Saisissez votre prénom :"
read prenom
echo "Bonjour $prenom !" > prenom.txt
Nous utilisons la commande read pour permettre la saisie d'une information de la part de l'utilisateur.
Sachez que lors de l'utilisation de "echo" pour écrire dans un fichier, nous pouvons ajouter un saut de ligne. Pour cela, il faut ajouter l'option "-e" à la commande echo puis utiliser "\n" pour ajouter un saut de ligne.
Par exemple :
#!/bin/bash
echo "Saisissez votre prénom :"
read prenom
echo -e "Bonjour $prenom ! \nBienvenue sur IT-Connect !" > prenom.txt
Le contenu du fichier obtenu en sortie montre bien que le saut de ligne a été pris en charge :
Remarque : pour aller plus loin dans le formatage du texte, envisagez d'utiliser "printf" à la place de "echo".
V. La technique Here Document (EOL)
La technique appelée Here Document ou heredoc est pratique pour écrire plusieurs lignes dans un seul et même fichier de sortie. Autrement dit, elle va permettre de rediriger plusieurs lignes vers un fichier.
Voici un exemple :
#!/bin/bash
cat << EOL > sortie.txt
> Bonjour !
> Voici le nom de l'utilisateur connecté : $(whoami)
> IT-Connect
> EOL
À partir du moment où la commande "cat << EOL > sortie.txt" est exécutée, nous ouvrons en quelque sorte une session pour écrire dans le fichier "sortie.txt". Une première ligne apparaît : il suffit d'écrire un texte et d'appuyer sur Entrée. Ensuite, une seconde ligne s'affiche et ainsi de suite... Pour quitter, il suffit d'indiquer le mot-clé "EOL" et d'appuyer sur Entrée.
Ci-dessous, le résultat en image :
VI. Écrire dans un fichier avec la commande tee
Sous Linux, la commande tee permet de lire l'entrée standard, d'écrire son contenu dans un fichier et de rediriger ensuite vers la sortie standard (ainsi, elle peut être positionnée entre deux commandes, via le pipeline). Donc, nous pouvons écrire dans un fichier tout en ayant le résultat de la commande dans la console.
Voici quelques exemples d'utilisation de la commande tee pour écrire dans un fichier.
Tout d'abord, pour écrire la sortie de la commande "ls" dans un fichier tout en affichant cette sortie à l'écran :
ls -l /home/flo/Documents/ | tee sortie_ls.txt
Voici le résultat obtenu :
Nous obtenons un résultat intéressant et un comportement différent vis-à-vis des redirecteurs.
Pour ajouter la sortie d'une commande dans un fichier sans écraser le contenu (équivalent de ">>"), nous devons ajouter l'option "-a", comme ceci :
ls -l /home/flo/Documents/ | tee -a sortie_ls.txt
Enfin, nous pouvons indiquer à la commande tee d'écrire dans plusieurs fichiers :
df -h | tee fichier1.txt fichier2.txt
Ces quelques exemples vous permettront de prendre en main la commande tee en tant qu'alternative aux opérateurs de redirection.
Note : si besoin, vous pouvez préciser "sudo" devant la commande tee pour élever vos privilèges si vous avez besoin d'écrire dans un répertoire protégé.
VII. Conclusion
Les opérateurs de redirection en Bash sont essentiels pour écrire dans un fichier de sortie. Ceux que l'on a évoqué dans ce tutoriel et que l'on a appris à utiliser, ne sont pas les seuls disponibles en Bash. Néanmoins, ce sont les plus utilisés. Donc, pour résumer :
- > : redirige la sortie d'une commande vers un fichier, en écrasant le contenu existant.
- >> : redirige la sortie d'une commande vers un fichier, en ajoutant le texte à la fin du fichier. Le contenu existant est préservé.
- << : utile pour la redirection de texte avec la technique Here Document (EOL)
Pour approfondir le sujet, vous pouvez consulter nos tutoriels Bash en utilisant le lien ci-dessous :