Bash pour les nuls


Sommaire

Présentation

Si vous avez cliquer sur ce lien c’est que vous souhaitez apprendre le scripting avec la langage de programmation Bash !

Si vous possédez déjà les bases et que vous souhaitez approfondir vos connaissances, je vous conseille de vous rendre dans la section « Bilbliographie« .

Cet article a été réalisé à l’aide d’un terminal d’Ubuntu 20.04 en CLI (Command Line Interface). Afin d’éviter de rencontrer quelconque problèmes, je vous conseille d’utiliser la même distribution ainsi que la même version.

Qu’est-ce que Bash ?

logo bash
Logo du langage de programmation Bash

Bash (Bourne Again Shell) est un shell informatique qui a été développé à partir du shell original écrit par Steve Bourne. Il est principalement utilisé dans les systèmes d’exploitation Unix et Linux, bien qu’il soit également disponible sur d’autres systèmes d’exploitation tels que macOS et Windows.

Le shell est un programme qui s’exécute sur votre ordinateur et qui vous permet de saisir des commandes à l’aide de votre clavier. Lorsque vous saisissez une commande et appuyez sur « Entrée », le shell exécute la commande en utilisant le système d’exploitation. Cela peut donc être utile pour effectuer diverses tâches, telles que lister les fichiers et dossiers dans un répertoire, copier ou déplacer des fichiers, ou exécuter des programmes.

Ce langage est également utilisé pour écrire des scripts, qui sont des séries de commandes qui peuvent être exécutées automatiquement pour accomplir une tâche spécifique. C’est à dire que les scripts peuvent être utilisés pour automatiser des tâches répétitives, pour créer des interfaces utilisateur personnalisées, ou même pour créer de petits programmes.

Bash est un shell populaire car il est facile à utiliser et très puissant. Il offre une grande flexibilité et de nombreuses options de configuration, ce qui en fait un choix courant pour les utilisateurs de systèmes d’exploitation Unix et Linux. Si vous utilisez un de ces systèmes d’exploitation, il y a de fortes chances que vous utilisiez déjà Bash ou que vous ayez l’occasion de le faire à l’avenir.

Image d'illustration de commandes Bash
Image d’illustration d’un terminal où des commandes Bash sont exécutées

Les bases

L’image ci-dessous, vous permet de voir quelques exemples de commandes exécutées dans mon terminal ainsi que ce qu’elles retournent.

Exemples de commandes exécutées dans mon terminal
  • Pour afficher la liste des fichiers et dossiers dans le répertoire courant, saisissez la commande « ls » et appuyez sur « Entrée ». Vous pouvez également utiliser la commande « ls -l » pour afficher la liste de manière plus détaillée.
  • Pour changer de répertoire, utilisez la commande « cd » suivie du nom du répertoire. Par exemple, la commande « cd Documents » vous emmènera dans le répertoire « Documents ». Pour revenir au répertoire parent, utilisez la commande « cd .. ».
  • Pour créer un nouveau fichier, utilisez la commande « touch » suivie du nom du fichier.
  • Pour copier un fichier, utilisez la commande « cp » suivie du nom du fichier à copier et du nom de la copie.
  • Pour déplacer un fichier, utilisez la commande « mv » suivie du nom du fichier à déplacer et de sa nouvelle emplacement.

Ce sont quelques exemples de commandes de base que vous pouvez utiliser avec Bash. Il existe de nombreuses autres commandes et options que vous pouvez utiliser pour effectuer diverses tâches. Pour en savoir plus sur une commande en particulier, vous pouvez utiliser la commande « man » suivie du nom de la commande (par exemple, « man ls » pour afficher la documentation de la commande « ls »).

Variables

  1. Nommage : le nom de votre variable ne doit pas être le même que celui d’une commande ou d’une fonction existante. Vous pouvez utiliser des lettres, des chiffres et des underscores (_) dans le nom de votre variable, mais il ne doit pas commencer par un chiffre.
  2. En Bash, une variable peut contenir n’importe quelle chaîne de caractères, il est recommandé de toujours encadrer les valeurs de variables avec des guillemets lorsqu’elles sont utilisées dans des commandes ou des expressions. Cela pour éviter tout problème avec les espaces et les caractères spéciaux. Par exemple, echo "$ma_variable" est plus sûr que echo $ma_variable.
  3. Déclaration et affectation : pour déclarer une variable en Bash, il suffit de lui affecter une valeur. Par exemple, ma_variable=foo déclare la variable ma_variable et lui affecte la valeur foo. De ce fait si vous utilisez une variable avant de l’avoir déclarée, Bash la considérera comme une chaîne vide.
  4. Les variables sont généralement locales au script ou au shell dans lequel elles sont déclarées. Si vous souhaitez rendre une variable globale, c’est-à-dire accessible partout dans votre script, vous pouvez la déclarer avec la commande declare -g ou l’exporter avec la commande export.
  5. Types : en Bash, il n’y a pas de type de données strict pour les variables. Cependant, vous pouvez utiliser des opérateurs de comparaison et des fonctions de test pour vérifier si une variable contient un nombre, une chaîne de caractères, etc.

Il est important de noter que les variables en Bash sont sensibles à la casse, c’est-à-dire que nom et Nom sont considérées comme deux variables différentes.

# Déclaration de la variable "nom" et affectation de la valeur "Alice"
nom="Alice"

# Affichage de la valeur de la variable "nom"
echo "Bonjour, $nom"
# Affichera "Bonjour, Alice"

# Affectation d'une nouvelle valeur à la variable "nom"
nom="Bob"

# Affichage de la nouvelle valeur de la variable "nom"
echo "Bonjour, $nom"
# Affichera "Bonjour, Bob"

Il est également possible de déclarer des variables d’environnement, qui sont accessibles dans tous les scripts et sous-processus lancés depuis le shell. Pour déclarer une variable d’environnement, il suffit de l’affecter avec la commande export :

# Déclaration de la variable d'environnement "MA_VARIABLE" et affectation de la valeur "foo"
export MA_VARIABLE="foo"

Conditions

Voici quelques points à prendre en compte lorsque vous utilisez des conditions Bash:

  1. Utilisez toujours les opérateurs de comparaison et les opérateurs logiques de manière appropriée. Par exemple, utilisez « == » pour tester l’égalité et « && » pour le ET logique.
  2. Assurez-vous de mettre les conditions entre crochets « [] » et de les encadrer avec des espaces. Par exemple: « [ $a -gt 0 ] » est correct, tandis que « [$a-gt0] » n’est pas correct.
  3. Testez toujours vos conditions avant de les utiliser dans vos scripts. Cela vous permettra de vous assurer qu’elles fonctionnent comme prévu et de découvrir et de corriger toutes les erreurs.
  4. Soyez vigilant lorsque vous utilisez des variables dans vos conditions. Assurez-vous que les variables sont définies et ont des valeurs correctes avant de les utiliser dans vos conditions.

Voici un exemple de condition Bash simple qui vérifie si une variable numérique est supérieure à zéro:

if [ $num -gt 0 ]; then
  echo "Le nombre est positif"
fi

Il existe de nombreux opérateurs de comparaison en Bash, comme -eq pour tester l’égalité, -ne pour tester l’inégalité, -gt pour tester si un nombre est supérieur à un autre, -lt pour tester si un nombre est inférieur à un autre, etc. Vous pouvez trouver la liste complète des opérateurs de comparaison dans la documentation de Bash.

Dans cet exemple, la condition « [ $num -gt 0 ] » vérifie si la variable numérique « num » est supérieure à zéro. Si c’est le cas, le script affiche le message « Le nombre est positif ».

Voici un autre exemple de condition qui vérifie si une chaîne de caractères est vide:

if [ -z "$string" ]; then
  echo "La chaîne est vide"
fi

Voici quelques exemples qui vous permettront de mieux comprendre les conditions :

# Déclaration de la variable "x" et affectation de la valeur "5"
x=5

# Vérification de la valeur de "x" avec la structure "if"
if [ "$x" -gt "0" ]; then
  # Si la condition est vraie, on exécute le code qui suit
  echo "x est supérieur à 0"
fi
# Affichera "x est supérieur à 0"

# Vérification de la valeur de "x" avec la structure "if-else"
if [ "$x" -gt "10" ]; then
  # Si la condition est vraie, on exécute le code qui suit
  echo "x est supérieur à 10"
else
  # Si la condition est fausse, on exécute le code qui suit
  echo "x n'est pas supérieur à 10"
fi
# Affichera "x n'est pas supérieur à 10"

# Vérification de la valeur de "x" avec la structure "if-elif-else"
if [ "$x" -gt "10" ]; then
  # Si la première condition est vraie, on exécute le code qui suit
  echo "x est supérieur à 10"
elif [ "$x" -eq "5" ]; then
  # Si la première condition est fausse mais que la seconde est vraie, on exécute le code qui suit
  echo "x est égal à 5"
else
  # Si aucune des conditions précédentes n'est vraie, on exécute le code qui suit
  echo "x n'est ni supérieur à 10 ni égal à 5"
fi
# Affichera "x est égal à 5"

Boucles

Voici un exemple de boucle « for » simple en Bash qui affiche les nombres de 1 à 5:

#!/bin/bash

for i in 1 2 3 4 5; do
  echo $i
done

Le code ci-dessus réalise les étapes ci-dessous:

  1. La boucle for parcourt une série de valeurs, dans ce cas, les nombres de 1 à 10.
  2. La variable $i prend chaque valeur à tour de rôle pendant chaque itération de la boucle.
  3. La commande echo imprime la valeur de $i à chaque itération.

Voici un exemple de boucle while en Bash :

#!/bin/bash

# Imprimer les nombres de 1 à 10
i=1
while [ $i -le 10 ]; do
    echo $i
    i=$((i+1))
done

Voici donc comment cela fonctionne :

  1. La boucle while répète une action tant qu’une condition est vraie. Dans ce cas, la condition est $i -le 10, ce qui signifie que la boucle s’exécutera tant que $i est inférieur ou égal à 10.
  2. La variable $i est initialisée à 1 avant le début de la boucle.
  3. La commande echo imprime la valeur de $i à chaque itération de la boucle.
  4. La variable $i est incrémentée de 1 à chaque itération de la boucle avec i=$((i+1)).
  5. Quand $i atteint 11, la condition $i -le 10 devient fausse et la boucle s’arrête.

Fonctions

Voici quelques points à prendre en compte lors de la création et de l’utilisation de fonctions en Bash :

  1. Nommage : le nom de votre fonction ne doit pas être le même que celui d’une commande ou d’une autre fonction existante. Vous pouvez utiliser des lettres, des chiffres et des underscores (_) dans le nom de votre fonction, mais il ne doit pas commencer par un chiffre.
  2. Arguments : vous pouvez définir des arguments pour votre fonction en les mettant entre parenthèses lors de sa déclaration. Par exemple, function ma_fonction { ... } déclare une fonction sans arguments, tandis que function ma_fonction { ($1) ($2) ... } déclare une fonction avec un ou plusieurs arguments. Pour accéder aux arguments dans votre code de fonction, vous pouvez utiliser les variables $1, $2, etc.
  3. Valeur de retour : une fonction en Bash peut renvoyer une valeur à l’aide de la commande return. Cette valeur peut être un nombre ou une chaîne de caractères. Par exemple, return 0 renvoie la valeur 0, qui est généralement utilisée pour indiquer que la fonction s’est exécutée avec succès.
  4. Portée des variables : les variables déclarées dans une fonction sont généralement locales à cette fonction et ne sont pas accessibles en dehors de celle-ci. Si vous souhaitez rendre une variable globale, c’est-à-dire accessible partout dans votre script, vous pouvez la déclarer avec la commande declare -g ou l’exporter avec la commande export.
  5. Erreurs : il est recommandé de vérifier les erreurs dans votre code de fonction et de gérer les erreurs potentielles avec la structure if-else ou la commande set -e (qui permet de quitter le script en cas d’erreur).

Prenons comme un exemple, une fonction plutôt simpliste qui permet de saluer une personne dont on passe en paramètre à la fonction son nom :

# Cette fonction s'appelle "saluer" et prend un seul argument, $1, qui est le nom de la personne à saluer
function saluer() {
  echo "Bonjour, $1"
}

# On peut maintenant utiliser la fonction "saluer" comme ceci :
saluer "Alice"
# Affichera "Bonjour, Alice"
Voici un autre exemple de fonction qui calcule le carré d'un nombre :
function carre {
  resultat=$(( $1 * $1 ))
  echo "$resultat"
}

# On peut maintenant utiliser la fonction "carre" comme ceci :
carre 4
# Affichera "16"

Mon premier script

Nous allons créer ensemble, votre premier script en Bash en utilisant les différentes notions vues précédemment !

La première étape est la création du fichier qui va contenir notre code :

touch mon-premier-script.sh
Création d'un fichier avec la commande touch
Création d’un fichier avec la commande touch

Pour modifier un fichier, vous pouvez utiliser la commande nano :

nano mon-premier-script.sh
Entête du script
Entête du script

Suite à la cela, la première ligne de notre programme servira à indiquer sa portabilité par rapport aux différents shells disponibles, dans notre cas, nous utiliserons bash :

#!/bin/bash

Nous allons créer un script qui nous retournera si la ville que nous spécifions fait partie des grandes villes de France :

#!/bin/bash

function grandeVilleFrance() {
        # echo -n permet de ne pas mettre de saut de ligne à la fin lors de l'éxécution
        echo -n "Dans quelle ville habitez-vous ? ";
        grandesVilles="Paris Strasbourg Tours Nantes";
        read villeSaisie;
        echo "Vous avez saisi ${villeSaisie}.";
        for ville in ${grandesVilles};
        do
                if [ "${ville}" == "${villeSaisie}" ];
                then
                        echo "Vous habitez dans une grande ville !";
                        exit;
                fi
        done;
        echo "Vous n'habitez pas dans une grande ville...";
}

# Il est nécessaire d'appeler la fonction afin de l'exécuter
grandeVilleFrance;

La dernière étape avant de lancer notre script et de le rendre exécutable :

chmod +x mon-premier-script.sh
On rend le fichier exécutable
On rend le fichier exécutable

Si vous ne faites pas l’étape précédente, vous obtiendrez l’erreur suivante :

Erreur s'affichant si le fichier n'est pas exécutable
Erreur s’affichant si le fichier n’est pas exécutable

Procédons à l’exécution de notre script !

Exécution du script

Lors de l’exécution, le programme nous demande de saisir une ville. Une fois saisie et validé, il s’occupe de vérifier si la ville fait partie du table de grandes villes que nous avons définis dans notre fonction. En fonction de s’il est présent ou non : il nous retourne une réponse différente.

Approfondir mes connaissances

Afin d’approfondir vos connaissances, je ne peux que vous conseillez de consulter les liens ci-dessous :

  • Playlist de vidéos d’Algomius accessible ici.
  • Interpréteur de commandes Bash en ligne accessible ici.
  • Pourquoi tu *dois* apprendre le BASHChristophe Casalegno, accessible ici.
  • BASH: Des scripts solidescocadmin, accessible ici.
  • Je corrige les scripts d’Ubuntu – Conseils et bonnes pratiques en BASHcocadmin, accessible ici.
  • Apprendre à scripter sur GNU/Linux – notamax, accessible ici.