Contents
Eléments d’un script shell
Un script shell est un fichier texte rendu exécutable en ligne de commande. La première ligne du fichier contient une ligne spéciale appelée shebang #!, suivi du chemin absolu vers l’interpréteur shell, qui peut être bash sh ou zsh, voire même un interpréteur python
#!/bin/bash #!/bin/zsh #!/usr/bin/python
Si vous omettez le shebang, alors c’est le shell courant qui est utilisé, mais dans ce cas il n’y aucune garantie que le script est compatible avec votre shell courant, donc il est très conseillé de le spécifier.
Les variables
Une variable est en majuscule et en snake case
#!/bin/bash
MY_SHELL="bash"
NOM_SERVEUR=$(hostname) // ou NOM_SERVEUR=`hostname` ancienne syntaxe
echo "J'aime mon $MY_SHELL shell."
echo "J'aime mon ${MY_SHELL}ing shell." // la syntaxe avec accolade permet de concaténer
Généralement les nom de variable valide suivent la m^me règle que dans les langages de programmation
Contrôle d’exécution
Les tests (équivalent de if else)
Syntaxe : [ condition-a-tester] exemple : [-e /etc/passwd] // teste si le fichier /etc/passwd existe Autres exemples : -d NOM_FICHIER True si fichier est un répertoire -e NOM_FICHIER True si le fichier existe -f NOM_FICHIER True si le fichier existe et est un fichier ordi -r NOM_FICHIER True si le fichier readable par moi -s NOM_FICHIER True si le fichier existe et est non vide -w NOM_FICHIER True si le fichier est writable par moi -x NOM_FICHIER True si le fichier est exécutable par moi -z STRING True si string est vide -n STRING True si string est non vide STRING1 = STRING2 égalité STRING1 != STRING2 inégalité # attention un seul signe égal !! #Tests arithmétiques arg1 -eq arg2 True si arg1 est égal à arg2 arg1 -ne arg2 True si arg1 est égal à arg2 arg1 -lt arg2 True si arg1 est less than à arg2 arg1 -le arg2 True si arg1 est less or equal à arg2 arg1 -gt arg2 True si arg1 est greater than à arg2 arg1 -ge arg2 True si arg1 est gretaer or equal à arg2
Branchement conditionnel
Syntaxe générale:
if [ condition-est-vraie ]
then
commande 1
commande 2
commande 3
fi
# exemple :
#!/bin/bash
AGE=34
if [ "$AGE" -eq 18 ]; // ici il faut entourer AGE de guillements et préfixer AGE d'un signe dollar
then
echo "vous avez ${AGE} vous êtes une personne mineure"
else
echo "vous avez ${AGE} vous êtes une personne majeure"
fi
# multiple condition avec elif
#!/bin/bash
AGE=20
if [ "$AGE" -lt 18 ]; then
echo "Vous êtes mineur."
elif [ "$AGE" -eq 18 ]; then
echo "Vous avez exactement 18 ans."
else
echo "Vous êtes majeur."
fi
# ET et OU
#!/bin/bash
AGE=20
CITOYEN="oui"
if [ "$AGE" -ge 18 ] && [ "$CITOYEN" = "oui" ]; then
echo "Vous pouvez voter."
else
echo "Vous ne pouvez pas voter."
fi
# avec CASE
#!/bin/bash
JOUR="samedi"
case "$JOUR" in
"lundi"|"mardi"|"mercredi"|"jeudi"|"vendredi")
echo "C'est un jour de travail."
;;
"samedi"|"dimanche")
echo "C'est le week-end !"
;;
*)
echo "Jour inconnu."
;;
esac
On va pousser le script un peu plus loin avec la récupération dynamique du jour, ainsi on n’a plus besoin de coder en dur.
Mais auparavant on va installer pour nous assurer sur le locale franançais est installé
locale LANG=fr_FR.UTF-8 LANGUAGE= LC_CTYPE="fr_FR.UTF-8" LC_NUMERIC="fr_FR.UTF-8" LC_TIME="fr_FR.UTF-8" LC_COLLATE="fr_FR.UTF-8" LC_MONETARY="fr_FR.UTF-8" LC_MESSAGES="fr_FR.UTF-8" LC_PAPER="fr_FR.UTF-8" LC_NAME="fr_FR.UTF-8" LC_ADDRESS="fr_FR.UTF-8" LC_TELEPHONE="fr_FR.UTF-8" LC_MEASUREMENT="fr_FR.UTF-8" LC_IDENTIFICATION="fr_FR.UTF-8" LC_ALL= si vous ne voyez pas ça c'est que ce n'est pas installé. Faites la commande suivante :
Linux installer le locale français
Si vous êtes sous wsl, il se peut que vous soyez toujours dans le système anglais, nous allons installer le locale français.
sudo locale-gen fr_FR.UTF-8 sudo update-locale LANG=fr_FR.UTF-8 sudo reboot # ou redémarrer votre shell (dans le cas de wsl également) # et refaite locale locale Après faites la commande date $ date sam. 08 mars 2025 16:17:23 CET Pour avoir le jour $ date +%A samedi # voilà vous avez tout pour recorriger le programme
Nouveau script avec le jour de semaine dynamique :
#!/bin/bash
JOUR=$(date +%A)
case "$JOUR" in
"lundi"|"mardi"|"mercredi"|"jeudi"|"vendredi")
echo "C'est un jour de travail."
;;
"samedi"|"dimanche")
echo "C'est le week-end !"
;;
*)
echo "Jour inconnu."
;;
esac
Les boucles en shellscript
Boucle for
Sans doute le plus facile
#syntaxe générale
for VARNAME in ITEM1 ITEM2
do
command 1
command 2
done
# exemple
#!/bin/bash
for COULEUR in rouge vert bleu
do
echo "COULEUR: $COULEUR"
done
# variante
#!/bin/bash
for COULEUR in rouge vert bleu
do
echo "COULEUR: $COULEUR"
done
Générer une séquence pour la boucle for
#générer avec seq (séquence)
#!/bin/bash
for i in $(seq 1 10)
do
echo $i
done
Exemple plus élaboré de script shell très utile
Supposons que nous voulions renommer des fichier images avec le nom du fichier avec la date du jour au formation numérique
Pour ce faire nous allons dans notre répertoire télécharger avec wget ou curl des images prise sur internet
wget -O image1.jpg http://source.com/imagealeatoire.jpg l'argument -O permet de renommer le fichier sauvé
#!/bin/bash
# on liste les fichiers images avec la commande ls et on mets le résultat dans une variables
IMAGES=$(ls *jpg)
DATE=$(date +%F)
for IMAGE in $IMAGES
do
echo "renommage de ${IMAGE} en ${IMAGE}-${DATE}"
mv ${IMAGE} ${IMAGE}-${DATE}
done
Le script marche mais n’est pas optimale car la date se rajoute à l’extension et nom au nom de fichier. Essayez de résoudre ce problème. (indice utiliser la fonction $(basename “$path”)
# solution
#!/bin/bash
IMAGES=$(ls *jpg)
DATE=$(date +%F)
for IMAGE in $IMAGES
do
FILENAME="${IMAGE%.*}"
EXT="${IMAGE##*.}"
echo "renommage de $IMAGE en ${FILENAME}-${DATE}.${EXT}"
mv ${IMAGE} ${FILENAME}-${DATE}.${EXT}
done
Boucle while
Paramètres positionnels
Quand vous exécutez un script vous pouvez passer des paramètres
$monscript.sh param1 param2 param3
Dans votre script vous pouvez y faire référence avec $1, $2 etc $0 représente le script lui-même.
#exemple de script pour archiver une utilisateur
echo "Executing script : $0"
echo "Archiving user : $1"
#lock the account
passwd -l $1
# create the archive of the home directory
tar cf /archvies/$[1}.tar.gz /home/${1}
#accès à tous les paramètres positionnels
for USER in $@ # suppose que tous les arguments sont des users
...
Lire les entrées claviers
#!/bin/bash read -p "Entrez un nom utilisateur: " USER echo "Archivage de l'utilisateur: $USER" ...
Exercice : pratiquer le script d’archivage avec l’entrée au clavier, et au passage d’arguments multiples
Les fonctions
#!/bin/bash
greet_user(){
echo -n "Entre ton prénom "
read nom
echo "Bonjour $nom ! Comment vas tu $1?"
greet_user "$1"
#Exécuter le script
$ ./greet.sh gros
