Qu'est-ce qu'un script ?
Un script est un ensemble d'instructions textuelles exécutables. Parmi les langages de script courants, on trouve JavaScript, Python, PHP, Ruby, Perl et bien sûr Shell.
Pourquoi utiliser le Shell ?
- Langage intégré nativement aux systèmes Unix/Linux
- Productivité élevée grâce à la puissance des commandes système
- Syntaxe accessible et courbe d'apprentissage rapide
- Idéal pour l'automatisation et les traitements par lots
Le Shell comme intermédiaire
Le Shell agit comme interface entre l'utilisateur et le noyau Linux. Écrit initialement en C, il interprète les commandes saisies et les transmet au noyau pour exécution.
Types de Shell
Interface graphique (GUI)
Environenments de bureau comme KDE, GNOME offrant une manipulation intuitive via fenêtres et icônes.
Interface en ligne de commande (CLI)
Interaction par saisie textuelle. Bash (Bourne-Again Shell) est l'implémentation standard sur la plupart des distributions Linux. D'autres existent : zsh, fish, ksh, csh.
Identifier votre Shell
Les interpréteurs disponibles sont listés dans /etc/shells :
$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/zsh
/usr/bin/fish
Pour connaître le Shell par défaut :
$ echo $SHELL
/bin/bash
Votre premier script
Créons un fichier bonjour.sh :
$ vim bonjour.sh
#!/bin/bash
echo "Bienvenue dans le monde Shell!"
Méthodes d'exécution
Méthode A : Invocation directe de l'interpréteur
$ bash bonjour.sh
Bienvenue dans le monde Shell!
Méthode B : Exécution avec permissions
$ chmod u+x bonjour.sh
$ ./bonjour.sh
Bienvenue dans le monde Shell!
Remarque : le préfixe ./ est nécessaire car le répertoire courant n'est généralement pas dans la variable PATH.
Méthode C : Exécution dans l'environnement courant
$ source bonjour.sh
Différences entre les modes d'exécution
| Méthode | Processus | Portée des variables |
|---|---|---|
bash script.sh |
Sous-shell créé | Variables locales au sous-shell |
./script.sh |
Sous-shell créé | Variables locales au sous-shell |
source script.sh |
Aucun sous-shell | Variibles persistantes dans le shell parent |
Commandes essentielles pour le traitement de texte
grep : filtrage de motifs
Recherche de patterns dans des fichiers ou l'entrée standard.
| Option | Fonction |
|---|---|
| -i | Insensible à la casse |
| -n | Affiche les numéros de ligne |
| -o | N'affiche que les correspondances |
| -c | Compte les lignes correspondantes |
| -v | Inverce la sélection (lignes non correspondantes) |
| -A N | Affiche N lignes après la correspondance |
| -B N | Affiche N lignes avant la correspondance |
| -C N | Affiche N lignes de contexte |
# Recherche insensible à la casse
$ echo "Bonjour Monde bonjour monde" | grep -i 'monde'
Bonjour Monde bonjour monde
# Affichage avec numéros de ligne
$ grep -n 'daemon' /etc/passwd
2:daemon:x:2:2:daemon:/sbin:/sbin/nologin
# Extraction uniquement des correspondances
$ echo "erreur: fichier introuvable" | grep -o '[a-z]*:'
erreur:
# Comptage des occurrences
$ grep -c 'nologin' /etc/passwd
16
cut : extraction de champs
Découpe des lignes selon des critères précis.
# Extraction par position de caractères
$ echo "2024-03-15" | cut -c 1-4
2024
# Extraction par délimiteur
$ echo "pierre:25:paris" | cut -d':' -f1,3
pierre:paris
# Extraction du troisième champ
$ cut -d' ' -f3 journal.log
sort : tri de données
Organise les lignes selon divers critères.
| Option | Description |
|---|---|
| -n | Tri numérique |
| -r | Ordre décroissant |
| -k N | Tri selon le Nième champ |
| -t C | Utilise C comme séparateur de champs |
| -u | Supprime les doublons |
# Tri numérique décroissant
$ echo -e "42\n7\n123\n5" | sort -nr
123
42
7
5
# Tri selon le deuxième champ (délimité par :)
$ cat notes.txt | sort -t':' -k2 -n
# Suppression des doublons
$ sort -u noms.txt
uniq : dédoublonnage
Élimine ou compte les lignes identiques consécutives.
# Comptage des occurrences
$ uniq -c frequences.txt
3 alpha
1 beta
5 gamma
# Affichage des lignes uniques (non répétées)
$ uniq -u log.txt
# Combinaison avec sort pour dédoublonner tout fichier
$ sort donnees.txt | uniq
seq : génération de séquences
Crée des suites numériques pour les boucles et tests.
# Séquence simple
$ seq 5
1
2
3
4
5
# Avec pas personnalisé
$ seq 0 2 10
0
2
4
6
8
10
# Format avec padding
$ seq -w 1 100 | tail -3
098
099
100
tr : transformation de caractères
Substitue ou supprime des caractères.
# Conversion casse
$ echo "Hello World" | tr 'A-Z' 'a-z'
hello world
# Suppression de caractères
$ echo "Tél: 01-23-45-67-89" | tr -d '0-9- '
Tél:
# Remplacement de caractères spécifiques
$ echo "hello_world" | tr '_' '-'
hello-world
# Compression des répétitions
$ echo "aaabbbccc" | tr -s 'a-c'
abc
Exercices pratiques
Exercice 1 : Créer un script qui ajoute un utilisateur apprenti et crée dans son répertoire personnel un fichier readme.txt contenant la date du jour.
Exercice 2 : Déterminer le nombre total de comptes utilisateurs sur le système.
Exercice 3 : Évaluer la quantité de paquets installés.
Défi : Analyse de logs web
À partir d'un fichier contenant des URLs, réalisez les opérations suivantes :
- Compter les occurrences de chaque domaine
- Classer les résultats par fréquence croissante
- Extraire les deux domaines les plus fréquents
Approche possible :
# Pipeline de traitement
$ cat acces.log | cut -d'/' -f3 | sort | uniq -c | sort -n | tail -2