🐧 Linux : Shell et scripts

Le shell est l'interface en ligne de commande de Linux. Il permet d'exécuter des commandes et d'automatiser des tâches via des scripts. Cette fiche présente les bases du shell Bash, le plus couramment utilisé sur les systèmes Linux.

📑 Sommaire

🐚 Commandes de base

Les commandes fondamentales pour interagir avec le shell :

echo "Bonjour monde"    # Affiche du texte
echo $HOME             # Affiche la valeur d'une variable
read nom               # Lit une entrée utilisateur et la stocke dans la variable nom
echo "Salut $nom"      # Affiche la valeur de la variable
date                   # Affiche la date et l'heure
pwd                    # Affiche le répertoire courant
whoami                 # Affiche l'utilisateur actuel

Utilisation de l'historique des commandes :

history                # Affiche l'historique des commandes
!123                   # Exécute la commande numéro 123 de l'historique
!!                     # Exécute la dernière commande

📝 Création de scripts

Un script shell est un fichier texte contenant une série de commandes :

#!/bin/bash
# Mon premier script shell
# Le shebang #!/bin/bash indique quel interpréteur utiliser

nom="Guillaume"
echo "Bonjour $nom"

echo "Aujourd'hui nous sommes le $(date +%d/%m/%Y)"
echo "Le répertoire courant est : $(pwd)"

Pour rendre le script exécutable et l'exécuter :

chmod +x monscript.sh    # Rend le script exécutable
./monscript.sh          # Exécute le script

Vous pouvez aussi l'exécuter sans le rendre exécutable :

bash monscript.sh        # Exécute le script avec bash

🔤 Variables et paramètres

Déclaration et utilisation des variables :

# Définition de variables
nom="Guillaume"
age=30
CONSTANTE="Valeur fixe"

# Utilisation de variables
echo "Je m'appelle $nom et j'ai $age ans"
echo "Je m'appelle ${nom} et j'ai ${age} ans"  # Syntaxe avec accolades

# Variables spéciales
echo "Nom du script : $0"
echo "Premier argument : $1"
echo "Deuxième argument : $2"
echo "Tous les arguments : $@"
echo "Nombre d'arguments : $#"
echo "PID du script : $$"
echo "Code de retour de la dernière commande : $?"

Lire des entrées utilisateur :

# Lecture simple
read -p "Entrez votre nom : " nom
echo "Bonjour $nom"

# Lecture avec timeout
read -p "Entrez votre mot de passe : " -t 10 -s password
echo -e "\nVotre mot de passe a été enregistré."

🔄 Structures de contrôle

Les structures conditionnelles et les boucles :

# Structure if-elif-else
if [ "$age" -lt 18 ]; then
  echo "Mineur"
elif [ "$age" -eq 18 ]; then
  echo "Tout juste majeur"
else
  echo "Majeur"
fi

# Boucle for
for i in 1 2 3 4 5; do
  echo "Numéro $i"
done

# Boucle for avec range
for i in {1..5}; do
  echo "Numéro $i"
done

# Boucle for de style C
for ((i=1; i<=5; i++)); do
  echo "Numéro $i"
done

# Boucle while
compteur=1
while [ $compteur -le 5 ]; do
  echo "Compteur : $compteur"
  ((compteur++))
done

# Boucle until (jusqu'à ce que)
compteur=5
until [ $compteur -lt 1 ]; do
  echo "Décompte : $compteur"
  ((compteur--))
done

# Structure case (switch)
read -p "Entrez un fruit : " fruit
case $fruit in
  "pomme")
    echo "C'est une pomme"
    ;;
  "orange"|"citron")
    echo "C'est un agrume"
    ;;
  *)
    echo "Fruit non reconnu"
    ;;
esac

Opérateurs de comparaison pour les nombres :

Opérateurs pour les chaînes :

🧩 Fonctions

Déclaration et utilisation des fonctions :

# Définition de fonction
saluer() {
  echo "Bonjour $1 !"
  return 0
}

# Fonction avec variables locales
calculer_somme() {
  local a=$1
  local b=$2
  echo $((a + b))
}

# Appel de fonction
saluer "Guillaume"
somme=$(calculer_somme 5 3)
echo "La somme est : $somme"

📊 Redirection et pipes

Rediriger les entrées et sorties :

# Redirection de sortie
echo "Hello" > fichier.txt     # Écrit dans le fichier (écrase)
echo "World" >> fichier.txt    # Ajoute au fichier

# Redirection d'entrée
sort < liste_noms.txt          # Trie le contenu du fichier

# Redirection d'erreur
command 2> erreurs.log         # Redirige les erreurs vers un fichier
command > output.log 2>&1      # Redirige stdout et stderr vers un fichier

# Pipes (tubes)
cat fichier.txt | grep "mot"   # Filtre les lignes contenant "mot"
ps aux | grep firefox | wc -l  # Compte les processus firefox
🎁 Bonus : Techniques avancées

Expressions régulières

# Vérification avec regex
if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
  echo "Email valide"
else
  echo "Email invalide"
fi

Tests sur les fichiers

if [ -f "$fichier" ]; then
  echo "Le fichier existe"
fi

if [ -d "$dossier" ]; then
  echo "Le dossier existe"
fi

if [ -x "$script" ]; then
  echo "Le script est exécutable"
fi

Manipulation de chaînes

# Longueur d'une chaîne
texte="Bonjour"
echo "Longueur : ${#texte}"

# Sous-chaîne
echo "Les 3 premiers caractères : ${texte:0:3}"

# Substitution
echo "${texte/jour/soir}"  # Remplace jour par soir

Tableaux

# Déclarer un tableau
fruits=("pomme" "orange" "banane")

# Accéder aux éléments
echo "Premier fruit : ${fruits[0]}"

# Parcourir un tableau
for fruit in "${fruits[@]}"; do
  echo "Fruit : $fruit"
done

# Longueur du tableau
echo "Nombre de fruits : ${#fruits[@]}"
🏠 Retour au sommaire général