6  Le script Shell

6.1 Introduction

Les scripts Shell sont un outil puissant pour automatiser des tâches sous Linux. Cette section présente les bases de la création et de l’exécution de scripts shell à l’aide de l’éditeur de texte nano.

Vue d’ensemble:

  • Apprendre à écrire son premier script avec des commandes de base.
  • Comprendre les autorisations d’exécution des scripts et le débogage.
  • Explorer les possibilités d’amélioration des scripts en les ajoutant à la liste des scripts $PATH.
  • Manipuler des variables et effectuer des calculs mathématiques.
  • Gérer les entrées de l’utilisateur et la logique conditionnelle.


6.2 Écrire votre premier script

Commencez par générer un nouveau fichier de script:

nano myscript.sh

Pour votre script:

  • Commencer par #!/bin/bash pour l’interpréteur.
  • Ajouter # pour les commentaires.

Exemple de script de base:

#!/bin/bash
# Lister les fichiers et les répertoires
ls

Pour sauvegarder votre script, utilisez Ctrl + O, and exit nano with Ctrl + X.

6.3 Exécuter votre script

Rendre le script exécutable:

chmod +x myscript.sh

Exécuter le script:

./myscript.sh

Déboguer le script:

bash -x myscript.sh

6.4 Ajout de scripts à $PATH

Pour exécuter votre script depuis n’importe où:

export PATH=$PATH:/path/to/script

Après cela, vous pouvez exécuter votre script en tapant simplement son nom:

myscript.sh

6.5 Travailler avec des variables

Pour utiliser des variables dans votre script:

#!/bin/bash
name="Alice"
echo $name

Pour les textes sur plusieurs lignes:

To print multi-line texts, use echo -e and \n for new lines:

#!/bin/bash
greeting="Hello\neveryone"
echo -e $greeting

6.6 Travailler avec des guillemets

Dans Bash, les guillemets peuvent modifier l’interprétation du texte:

  • ' ': Guillemets simples
  • " ": Guillemets doubles
  • ` `: Retour à la case départ

Le comportement des variables et des commandes change en fonction des guillemets utilisés:

6.6.1 Guillemets simples

Utiliser des guillemets simples:

message="Good morning"
echo 'Le message est : $message'

Produit:

Le message est : $message

Les guillemets simples empêchent l’expansion des variables et traitent $message comme du texte littéral.

6.6.2 Guillemets doubles

Utilisation des guillemets doubles:

message="Good morning"
echo "Le message est : $message"

Produit:

Le message est le suivant : Bonjour

Les guillemets doubles permettent l’expansion des variables, ainsi $message est remplacé par sa valeur.

6.6.3 Retour à la case départ

Les antisèches exécutent la commande à l’intérieur et capturent sa sortie:

message=`pwd`
echo "The working directory is: $message"

Produit un message du type:

The working directory is: /home/user

Les antisèches exécutent la commande pwd and assign its output to message.

6.7 Capturer les données de l’utilisateur

La commande read dans les scripts Bash est conçue pour capturer les données de l’utilisateur et les stocker dans des variables.

6.7.1 Utilisation de base

Utilisez simplement read suivi d’un nom de variable pour stocker l’entrée de l’utilisateur:

read name

Dans cet exemple, l’entrée de l’utilisateur est stockée dans la variable name.

6.7.2 Stockage des données dans plusieurs variables

Vous pouvez capturer des données dans plusieurs variables comme ceci:

read name var2 var3

Cette commande attend une seule ligne d’entrée, qui est ensuite séparée par des espaces et stockée dans nom, var2, et var3 respectivement.

6.7.3 Options pour la read

Invitation avec -p:

Vous pouvez afficher un message d’invite avant de capturer des données:

#!/bin/bash

read -p 'Enter your name: ' name
echo "Good morning, $name!"

Limiter les entrées avec -n:

Limiter le nombre de caractères que l’utilisateur peut saisir:

#!/bin/bash

read -p 'Enter your name (5 characters max): ' -n 5 name
echo -e "\nGood morning, $name!"

Délai d’attente avec -t:

Fixer une limite de temps pour l’entrée:

#!/bin/bash

read -p 'Enter your name (within 5 seconds): ' -t 5 name
echo -e "\nGood morning, $name!"

Entrée silencieuse avec -s:

Pour les informations sensibles, comme les mots de passe, utilisez -s pour masquer l’entrée:

#!/bin/bash

read -p 'Enter your password: ' -s pass
echo -e "\nThank you, your password has been recorded."

6.8 Effectuer des opérations arithmétiques

Bash prend en charge l’arithmétique de base à l’aide de la commande let:

#!/bin/bash

let "a = 5"
let "b = 7"
let "c = a + b"
echo $c

Dans cet exemple, c will output the sum of a and b, which is 12.

6.8.1 Opérateurs arithmétiques:

  • +: Addition
  • -: Soustraction
  • *: Multiplication
  • /: Division
  • **: Exponentiation
  • %: Module

Vous pouvez également utiliser la notation abrégée, où let "a = a * 2" is equivalent to let "a *= 2".

6.9 Accès aux paramètres du script

Les scripts peuvent accepter des paramètres, accessibles via des variables spéciales:

./yourscript.sh param1 param2 param3
  • $#: Nombre de paramètres transmis au script
  • $0: The script’s name (./yourscript.sh dans ce cas)
  • $1, $2, $3, etc. : le premier, le deuxième, le troisième (et ainsi de suite) paramètre

6.10 Travailler avec des tableaux

Les tableaux dans Bash peuvent être utilisés pour stocker et accéder à des valeurs multiples:

# Déclarer un tableau
array=("value0" "value1" "value2")

# Accéder à un élément
echo ${array[2]}  # Produit « valeur2 »

# Modifier un élément
array[2]="newValue"

# Imprimer tous les éléments
echo ${array[*]}  # Sortie de tous les éléments du tableau

Les tableaux offrent un moyen flexible de travailler avec des collections de données dans vos scripts.

6.11 Travailler avec des conditions

6.11.1 Déclaration « if » de base

L’instruction if vérifie une condition et exécute un bloc de code si la condition est vraie:

name="Robert"

if [ "$name" == "Robert" ]; then
    echo "Hi Robert"
fi

6.11.2 Déclarations if imbriquées

Vous pouvez imbriquer les instructions if les unes dans les autres ou utiliser elif pour des conditions supplémentaires:

if [ condition1 ]; then
    # Bloc de code pour la condition1
elif [ condition2 ]; then
    # Bloc de code pour la condition2
else
    # Bloc de code par défaut
    if [ condition4 ]; then
        # If imbriqué
    fi
fi

6.11.3 Comparaisons de chaînes de caractères

Test Description de l’option
$var1 == $var2 Vérifier si var1 est égal à var2
$var1 != $var2 Vérifier si var1 n’est pas égal à var2
-z $var1 Vérifier si var1 est vide
-n $var1 Vérifier si var1 n’est pas vide

6.11.4 Comparaisons numériques

Test Description de l’option
$num1 -eq $num2 num1 est égal à num2
$num1 -ne $num2 num1 n’est pas égal à num2
$num1 -lt $num2 num1 est inférieur à num2
$num1 -gt $num2 num1 est supérieur à num2
$num1 -le $num2 num1 est inférieur ou égal à num2
$num1 -ge $num2 num1 est supérieur ou égal à num2

6.11.5 Tests de fichiers

Test Description de l’option
-e $file Vérifier si un fichier existe
-d $file Vérifier si le fichier est un répertoire
-f $file Vérifier si le fichier est un fichier normal
-L $file Vérifier si le fichier est un lien symbolique
-r $file Vérifier si le fichier est lisible
-w $file Vérifier si le fichier est inscriptible
-x $file Vérifier si le fichier est exécutable
$file1 -nt $file2 Vérifier si file1 est plus récent que file2
$file1 -ot $file2 Vérifier si file1 est plus ancien que file2

6.11.6 Combinaison de tests

  • Utilisez && pour un ET logique
  • Utiliser || pour le OU logique

6.11.7 Négation d’un test

Utiliser ! pour annuler un test:

if [ ! -e "$file" ]; then
    echo "The file doesn't exist"
fi

6.11.8 Utilisation de case pour des conditions multiples

L’instruction case est utile pour faire correspondre une variable à plusieurs motifs:

case $var in
    "Bruno")
        echo "Hello Bruno"
        ;;
    "Michel")
        echo "Hello Michel"
        ;;
    "Jean")
        echo "Hello Jean"
        ;;
    *)
        echo "I don't know you"
        ;;
esac

6.11.9 Boucles

Boucle While:

while [ condition ]; do
    # Commandes
done

Boucle For:

Boucle sur une liste de valeurs:

for variable in value1 value2 value3; do
    echo "The variable is $variable"
done

Bouclez les fichiers du répertoire actuel:

for file in $(ls); do
    echo "File found: $file"
done

Boucle avec une séquence:

for i in $(seq 1 10); do
    echo $i
done

6.12 Conclusion

En apprenant les scripts shell, vous pouvez automatiser des tâches répétitives, ce qui rend votre expérience de Linux plus productive et plus agréable.