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.