Bash #01 | Apprendre à scripter sur GNU/Linux !

Bash #01 | Apprendre à scripter sur GNU/Linux !

Identique à ma « mini-série » datant d’il y a environ deux ans sur Powershell, nous nous retrouvons ici avec Bash !

Bien, comme dit en introduction j’ai décidé de créer une nouvelle « mini-série » consacrée au scripting bash sur Linux. Comme pour celle sur Powershell (ici pour les plus curieux), nous allons voir ensemble comment réaliser divers petits scripts, mais nous allons même faire plus que ça : nous allons voir ensemble pas à pas les notions de base pour apprendre à scripter (conditions, boucle, variables, shellcheck…)

La raison de tout ça ? Et bien, même si j’utilise Linux depuis plusieurs années maintenant, je n’ai jamais (ou que très rarement) eut recours à des scripts Bash. De facto, je n’ai donc quasiment aucune connaissance sur le sujet… et j’ai récemment eut un entretien d’embauche où la réalisation de script était demandée.

Du coup, faisons d’une pierre deux coups ! Je vais me lancer sur cette série pour vous apprendre, mais pour aussi apprendre par moi-même !

A noter que dans ce premier article nous verrons vraiment la base de la base, et au fil des articles nous approfondirons les notions déjà vues ici, l’important de ce premier article est de vraiment cerner les mécanismes de base.

I) La notion de shebang

Rentrons directement dans le vif du sujet. Ici, nous serons donc sur une bonne vieille Ubuntu 20.04 en mode Desktop, et nous allons simplement créer un fichier nommé sobremment test.sh :

La première étape lorsque l’on créer un script en bash, c’est de définir la portabilité de ce script. Je m’explique: sur Linux, il y a plusieurs shells disponibles, jusque là rien de nouveau.

  • Bash, pour Bourne Again Shell, celui présent dans 99% des distributions ;
  • sh, pour Bourne Shell, qui est le plus ancien et que l’on rencontrera quelques fois, surtout du côté Unix/BSD ;
  • zsh, pour Z Shell, qui est un shell plus récent et compatible Bash, avec des fonctionnalités supplémentaires ;
  • csh, pour C Shell, un shell se rapprochant du langage C ;

Etc, etc. Il en existe encore beaucoup d’autres, mais l’important à retenir ici est que lorsque l’on créer un script, la toute première ligne est nommé le shebang, et c’est une ligne qui permet d’indiquer quel est le shell à utiliser pour exécuter notre script.

De ce fait, si je mets comme shebang #!/bin/bash, mon script utilisera Bash. Sauf que, si vous désirez par exemple rendre ce script portable et donc qu’il puisse s’exécuter aussi bien sur des systèmes modernes (Ubuntu, Fedora, Arch…) que des plus anciens (AIX, Solaris…), ça ne fonctionnera pas ! Et pour cause, sur les Unix et certains BSD (et quelques trèèès rares distributions Linux), le shell par défaut est sh, et bash n’est pas installé.

C’est donc à vous de voir:

  • Vous souhaitez rendre votre script entièrement portable, et respecter un maximum de standards POSIX et autre, utilisez sh ;
  • Si vous souhaitez créer un script uniquement pour GNU/Linux, utilisez bash ;

Ici nous utiliserons bash, mais si vous souhaitez utiliser un autre shell, la méthode reste la-même: toujours mettre une ligne de type #!/chemin/vers/mon/shell, donc par exemple #!/bin/bash, #!/bin/sh, etc.

II) Rendre le script exécutable

Rajoutons simplement un echo « It works ! » en seconde ligne, et essayons de l’exécuter via un ./test.sh :

Et oui… quand on créer un fichier de base sur Linux, ce dernier n’a pas les droits d’exécution. Pour remédier à cela, un simple chmod +x test.sh pour lui donner le droit d’être exécutable :

Tout cela est basique bien-entendu, mais ce genre de rappel ne fait jamais de mal. Maintenant, on va pouvoir s’attaquer à la partie algorithmie de Bash !

III) Les variables

La première chose que l’on va apprendre ici est comment créer des variables et leur attribuer des valeurs. Pour Bash, et contrairement à d’autres langages de programmation, il ne faut pas spécifier le type de variable.

Par exemple, dans la plupart des langages on fera quelque chose comme :

  • int age=22 ;
  • char name=anthony ;

Mais en bash, nous pourrons simplement faire :

  • age=22
  • nom= »anthony »

Et c’est tout ! Il n’y en réalité que deux types de variables que nous verrons plus tard, les variables définies par le système et celles définies par l’utilisateur.

Donc, reprenons notre script de test et rajoutons nos deux variables d’exemple :

J’ai simplement rajouté deux commentaires comme expliqués sur la capture d’écran, et j’ai aussi rajouté deux commandes: echo $nom_de_ma_variable.

Echo est une commande simple qui ne fait qu’afficher du texte, ou dans notre cas le contenu de notre variable. Si on exécute donc notre script voici ce que l’on obtient :

Les commentaires ne s’affichent pas (logique), et le contenu de mes deux variables est bien affichée !

A noter que j’aurais très bien pu faire ceci: age= »22″, car comme dit avant nous ne devons pas spécifier le type de variable, ici Bash ne voit que du texte.

Allons un peu plus loin… essayons d’afficher un message du genre « Voici mon nom: (variable), et mon âge: (variable) !« .

La sortie sera donc :

C’est tout bon, non ? Sauf que ! Il faut cerner une notion importante ici. Celle des quotes, c’est-à-dire des apostrophes.

Ici le script a fonctionné car j’ai utilisé des guillemets, c’est-à-dire des « , de ce fait Bash va analyser le contenu de la chaîne de caractère et si il y voit des variables ou autre, il va les afficher. Mais si je fais de même en utilisant de simplement apostrophes (), voic ce que ça donnerait :

Comme on peut le voir, déjà via Visual Studio Code et l’extension Bash IDE, on voit que mes deux variables contenues dans echo ne sont plus en couleurs, et ensuite quand j’exécute le script il s’affiche « tel quel », c’est-à-dire que cette-fois Bash n’intérprétera pas les variables à l’intérieur.

Il faut donc bien veiller à utiliser les singles quotes et doubles quotes à bon escient.

Avant de clôturer cette notion de quote, il en existe une troisième sorte, appelé les back quote, qui sont des accents graves (`).

Pour réaliser un accent grave sur un clavier Français-Belgique, il convient de faire le raccourci suivant: AltGr + µ. Pour un clavier Français-France, il faudra faire AltGr + 7 (sur le pavé numérique).

Ces back quotes sont un peu spéciales, testons-les directement pour voir de quoi il en retourne…

Tadaaaa ! Les back quotes permettent de dire à Bash d’exécuter le contenu compris entre ces même back quotes. De cette manière, ici je déclare une simple variable pseudo, basique, puis je déclare une seconde nommée vrai_nom avec la commande whoami à l’intérieur, et entre back quotes ! Ensuite via echocette-fois ci en utilisant des doubles quotes pour pouvoir dire à Bash de prendre en compte le contenu des variables-, je peux donc afficher le contenu de ma variable vrai_nom, qui est donc le résultat de la commande whoami.

Décrit comme cela, c’est peut être un peu tiré par les cheveux je vous l’accorde haha, mais avec les différentes captures c’est sûrement bien plus parlant pour vous.

IV) Les conditions

En bash comme dans n’importe quel langage, on retrouvera des conditions que l’on pourra utiliser dans nos scripts.

Commençons par la plus simple, à savoir la conditon if (si en français) :

Ici on déclare une variable, nommée age avec une certaine valeur, ensuite on écrit notre conditon :

Si la variable age est égale à « 18 », alors on fait un echo. Ensuite, on clôture la condition avec un fi.

Plusieurs points sont à noter ici: un espace est obligatoire entre les crochets, on ne peut pas écrire par exemple [$age= »18″], on doit laisser deux espaces (avant/après). Il n’est pas nécessaire de faire un espace ou une tabulation après le then, mais c’est toujours mieux pour plus de lisibilité.

Ensuite, il faut savoir qu’on peut écrire cette condition de la manière suivante, qui revient au même, c’est à vous de choisir laquelle vous préférez :

On enlève simplement le ; et on place le then sur la ligne en dessous. Certains aiment moins, d’autres préfèrent… le résultat est cependant identique.

Passons ensuite à la condition else, qui signifie sinon en anglais.

Globalement ce n’est rien de très compliqué, on reprend notre condition if montrée plus haut, et on rajoute un « sinon » :

Si l’âge est égal à 18 ans, dans ce cas on affiche un message disant que nous sommes majeur, sinon, on affiche un autre message. C’est certes très basique, mais ça vous permet de bien cerner la façon de fonctionner de cette condition.

Et enfin la dernière condition que nous verrons aujourd’hui, c’est la condition elif qui signifie donc sinon si. Globalement, rien de nouveau sous le soleil: on reprend la condition ci-dessus, mais on la modifie pour rendre le tout cohérent :

Si la variable age a la valeur 18, alors on affiche un message, sinon si la variable age est égale à joker, on affiche un autre message, et si age n’est pas équivalent à 18 ou à joker, on affiche un autre message.

Un peu prise de tête, mais vous comprenez le principe !

V) Conclusion

Ceci conclut donc ce premier article traitant du scripting Bash ! Beaucoup de basique, mais il est nécessaire de se rappeler de certaines bases…

Dans les prochains articles nous parlerons bien-entendu de notions un poil plus avancées, comme let, les variables systèmes/utilisateurs, l’utilisation de shellchecker, etc ! Car il n’y a pas que des chaînes de caractères avec Bash…

Même si cette série d’articles s’adresse aux débutants, j’espère tout de même vous avoir appris quelques bricoles comme à mon habitude 😉

4 comments

comments user
Saragosse

bonjour,
je débute, ce petit tuto est bien fait pour quelqu’un qui découvre le scripting shell avec bash ,
il y a un début à tout . J’attends la suite avec impatience, j’ai découvert l’appli Shellcheck et ai hâte de voir la façon de l’utiliser.
Merci pour ce partage, .plutôt limpide et pas trop technique

Saragosse

    comments user
    Mairien Anthony

    Hello Saragosse, merci pour ton commentaire !

    Je t’avoue que j’avais très largement mis de côté cette série de tutos, mais il faudrait que je m’y remette effectivement…

comments user
Champion

Bonjour,
Je suis en formation Tssr à distance et en plein dans le module « initiation Scripting bash »
Bon j’y comprenais rien jusqu’à ce que je tombe sur ton tuto.
Merci grâce a toi j’ai pu réaliser les premiers Tp.
J’avoue je suis un peu deg en voyant qu’il n’y a pas de suite 🙂
En tout cas je met ton blog en favori je pense que je vais apprendre plein de truc sympa ici.

    comments user
    Mairien Anthony

    Hey merci à toi Champion, super sympa de ta part !

    Effectivement j’avoue que comme pour la série Powershell j’avais laissé un peu de côté… je compte doucement mais sûrement me remettre à la rédaction d’articles, après déjà quelques moi de pause. Concernant la série sur Bash, je vais essayer mais je ne peux rien te promettre :p

Laisser un commentaire