Introduction au scripting shell+

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

A propos de l'auteur

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *