Shell

🚀 Intermédiaire

Fonctions en Shell

Les fonctions permettent de réutiliser du code et d'organiser vos scripts.

#!/bin/bash # Définir une fonction dire_bonjour() { echo "Bonjour, $1 !" } # Appeler la fonction dire_bonjour "Alice" dire_bonjour "Bob" # Fonction avec retour calculer_somme() { local a=$1 local b=$2 local resultat=$((a + b)) echo $resultat } somme=$(calculer_somme 5 3) echo "La somme est : $somme" # Fonction avec valeur de retour verifier_fichier() { if [ -f "$1" ]; then return 0 # succès else return 1 # échec fi } if verifier_fichier "config.txt"; then echo "Fichier trouvé" fi
💡 Conseil : Utilisez local pour déclarer des variables locales dans vos fonctions.

Expressions régulières avancées

Regex avec grep

# Trouver des emails grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' fichier.txt # Trouver des numéros de téléphone grep -E '[0-9]{2}[. -]?[0-9]{2}[. -]?[0-9]{2}[. -]?[0-9]{2}[. -]?[0-9]{2}' contacts.txt # Trouver des URLs grep -E 'https?://[^\s]+' fichier.txt # Utiliser des groupes de capture grep -E '(error|warning|critical)' logs.txt

Sed pour la manipulation de texte

# Remplacer du texte sed 's/ancien/nouveau/' fichier.txt # Remplacer toutes les occurrences sur chaque ligne sed 's/ancien/nouveau/g' fichier.txt # Modifier le fichier directement sed -i 's/ancien/nouveau/g' fichier.txt # Supprimer des lignes sed '3d' fichier.txt # Supprimer ligne 3 sed '/pattern/d' fichier.txt # Supprimer lignes contenant pattern sed '1,5d' fichier.txt # Supprimer lignes 1 à 5 # Insérer du texte sed '2i\Nouvelle ligne' fichier.txt # Insérer avant ligne 2 sed '2a\Nouvelle ligne' fichier.txt # Insérer après ligne 2

Awk pour le traitement de données

# Afficher la première colonne awk '{print $1}' fichier.txt # Afficher plusieurs colonnes awk '{print $1, $3}' fichier.txt # Utiliser un délimiteur personnalisé awk -F',' '{print $1, $2}' fichier.csv # Conditions awk '$3 > 100 {print $1, $3}' data.txt # Calculer une somme awk '{sum += $2} END {print sum}' nombres.txt # Compter les lignes awk 'END {print NR}' fichier.txt # Script awk complexe awk ' BEGIN { total = 0 } { if ($3 > 50) { total += $3 count++ } } END { print "Total:", total print "Moyenne:", total/count } ' data.txt

Gestion des processus

Contrôle des processus

# Lister tous les processus ps aux # Trouver un processus spécifique ps aux | grep firefox # Arbre des processus pstree # Processus en temps réel top # ou htop # Tuer un processus kill PID kill -9 PID # Force kill # Tuer par nom pkill firefox killall firefox # Exécuter en arrière-plan ./script.sh & # Lister les jobs en cours jobs # Ramener un job au premier plan fg %1 # Envoyer un job en arrière-plan bg %1

Substitution de commandes et paramètres

#!/bin/bash # Substitution de commande date_actuelle=$(date +%Y-%m-%d) echo "Aujourd'hui : $date_actuelle" # Ancienne syntaxe (à éviter) nombre_fichiers=`ls | wc -l` # Paramètres de script echo "Nom du script : $0" echo "Premier paramètre : $1" echo "Deuxième paramètre : $2" echo "Tous les paramètres : $@" echo "Nombre de paramètres : $#" # Valeurs par défaut fichier=${1:-"default.txt"} echo "Fichier : $fichier" # Expansion de paramètres nom="document.txt" echo "${nom%.txt}.pdf" # document.pdf echo "${nom#*.}" # txt echo "${nom/doc/file}" # filement.txt

Arrays (tableaux)

#!/bin/bash # Déclarer un array fruits=("pomme" "banane" "orange") # Accéder aux éléments echo "${fruits[0]}" # pomme echo "${fruits[@]}" # tous les éléments echo "${#fruits[@]}" # nombre d'éléments # Ajouter un élément fruits+=("fraise") # Boucler sur un array for fruit in "${fruits[@]}"; do echo "Fruit : $fruit" done # Array associatif (dictionnaire) declare -A ages ages["Alice"]=25 ages["Bob"]=30 echo "${ages["Alice"]}"

Gestion des erreurs

#!/bin/bash # Exit codes commande if [ $? -eq 0 ]; then echo "Succès" else echo "Échec" fi # Arrêter en cas d'erreur set -e # Afficher les commandes exécutées set -x # Combiner les deux set -ex # Fonction de gestion d'erreur error_exit() { echo "Erreur : $1" >&2 exit 1 } # Utilisation [ -f "fichier.txt" ] || error_exit "Fichier manquant" # Trap pour nettoyer avant de quitter cleanup() { echo "Nettoyage..." rm -f temp_* } trap cleanup EXIT

Script pratique : Backup automatique

#!/bin/bash # Script de sauvegarde BACKUP_DIR="/backup" SOURCE_DIR="/home/user/documents" DATE=$(date +%Y-%m-%d_%H-%M-%S) BACKUP_FILE="backup_${DATE}.tar.gz" # Vérifier que le dossier source existe if [ ! -d "$SOURCE_DIR" ]; then echo "Erreur : Le dossier source n'existe pas" exit 1 fi # Créer le dossier de backup s'il n'existe pas mkdir -p "$BACKUP_DIR" # Créer l'archive echo "Création de la sauvegarde..." tar -czf "${BACKUP_DIR}/${BACKUP_FILE}" "$SOURCE_DIR" 2>/dev/null # Vérifier le succès if [ $? -eq 0 ]; then echo "✓ Sauvegarde créée : ${BACKUP_FILE}" # Supprimer les backups de plus de 7 jours find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +7 -delete echo "✓ Anciennes sauvegardes supprimées" else echo "✗ Erreur lors de la création de la sauvegarde" exit 1 fi

Exercices pratiques

  1. Créez un script avec une fonction qui vérifie si un utilisateur existe sur le système
  2. Utilisez sed pour remplacer toutes les occurrences d'un mot dans plusieurs fichiers
  3. Écrivez un script awk qui calcule la moyenne d'une colonne de nombres
  4. Créez un script de monitoring qui affiche l'utilisation CPU et mémoire toutes les 5 secondes
  5. Faites un script qui prend des paramètres en ligne de commande et les traite