Bash

Bash (Bourne Again SHell) est le shell Unix par défaut sur la plupart des systèmes Linux et macOS. Il s'utilise de deux façons complémentaires : en mode interactif pour exécuter des commandes dans le terminal, et en mode script pour automatiser des tâches répétitives.

Se repérer et se déplacer

pwd                     # affiche le répertoire courant
ls                      # liste les fichiers
ls -la                  # liste détaillée avec fichiers cachés
cd /chemin/vers/dossier # se déplacer
cd ..                   # remonter d'un niveau
cd ~                    # aller dans le répertoire home
cd -                    # revenir au répertoire précédent

Créer, copier, déplacer, supprimer

mkdir mon-dossier           # créer un dossier
mkdir -p a/b/c              # créer les dossiers intermédiaires si besoin
touch fichier.txt           # créer un fichier vide

cp source.txt dest.txt      # copier un fichier
cp -r dossier/ copie/       # copier un dossier récursivement
mv ancien.txt nouveau.txt   # renommer ou déplacer
rm fichier.txt              # supprimer un fichier
rm -rf dossier/             # ⚠️ supprimer un dossier et son contenu

Lire des fichiers

cat fichier.txt             # afficher tout le contenu
less fichier.txt            # afficher page par page (q pour quitter)
head -n 20 fichier.txt      # afficher les 20 premières lignes
tail -n 20 fichier.txt      # afficher les 20 dernières lignes
tail -f fichier.log         # suivre un fichier en temps réel

Redirections et pipes

commande > fichier.txt      # redirige la sortie (écrase)
commande >> fichier.txt     # redirige la sortie (ajoute)
commande 2> erreurs.txt     # redirige les erreurs
commande > out.txt 2>&1     # redirige sortie ET erreurs

commande1 | commande2       # pipe : envoie la sortie de 1 vers 2
echo "hello" | tr 'a-z' 'A-Z'  # exemple : convertit en majuscules

Permissions

Lire les permissions

ls -la
# -rwxr-xr-- 1 user group 1234 jan 1 fichier.txt
#  ↑↑↑↑↑↑↑↑↑
#  │└──┬───┘└──┬───┘└──┬──┘
#  │  owner   group   others
#  └─ type (- fichier, d dossier, l lien)

r = lecture (4), w = écriture (2), x = exécution (1)

Modifier les permissions

# Notation symbolique
chmod +x script.sh          # ajouter l'exécution
chmod u+w fichier.txt       # ajouter l'écriture pour le propriétaire
chmod go-r fichier.txt      # retirer la lecture pour group et others

# Notation octale
chmod 755 script.sh         # rwxr-xr-x
chmod 644 fichier.txt       # rw-r--r--
chmod 600 cle_privee        # rw------- (clé SSH)

Changer le propriétaire

chown user fichier.txt
chown user:group fichier.txt
chown -R user:group dossier/    # récursif

Processus

Surveiller les processus

ps aux                      # liste tous les processus
ps aux | grep nginx         # filtrer par nom
top                         # vue temps réel (q pour quitter)
htop                        # vue améliorée (si installé)

Contrôler les processus

kill 1234                   # envoie SIGTERM au PID 1234
kill -9 1234                # envoie SIGKILL (force)
killall nginx               # tue tous les processus nommés nginx

commande &                  # lancer en arrière-plan
jobs                        # liste les tâches en arrière-plan
fg %1                       # ramener la tâche 1 au premier plan
bg %1                       # reprendre la tâche 1 en arrière-plan

nohup commande &            # lancer sans être tué à la fermeture du terminal

Variables de processus

$$      # PID du script en cours
$!      # PID du dernier processus lancé en arrière-plan
$?      # code de retour de la dernière commande (0 = succès)

find et grep

find — rechercher des fichiers

find . -name "*.log"                    # par nom (récursif depuis .)
find /var -name "*.log" -type f         # fichiers uniquement (pas dossiers)
find . -type d -name "node_modules"     # dossiers nommés node_modules
find . -mtime -7                        # modifiés il y a moins de 7 jours
find . -size +10M                       # fichiers de plus de 10 Mo

# Exécuter une commande sur chaque résultat
find . -name "*.tmp" -exec rm {} \;     # supprimer tous les .tmp
find . -name "*.sh" -exec chmod +x {} \;

grep — rechercher dans le contenu

grep "motif" fichier.txt                # chercher dans un fichier
grep -r "motif" ./dossier               # chercher récursivement
grep -i "motif" fichier.txt             # insensible à la casse
grep -n "motif" fichier.txt             # affiche les numéros de ligne
grep -l "motif" *.txt                   # affiche seulement les noms de fichiers
grep -v "motif" fichier.txt             # lignes ne contenant PAS le motif
grep -E "erreur|warning" fichier.log    # regex étendue (alternance)

Combinaisons utiles

find . -name "*.js" | xargs grep -l "console.log"   # fichiers JS contenant console.log
grep -r "TODO" . --include="*.py"                    # limiter aux .py
ps aux | grep -v grep | grep nginx                   # exclure la ligne grep elle-même

Écrire un script

Structure de base

#!/bin/bash
# Description courte du script

set -e          # quitter si une commande échoue
set -u          # erreur si variable non définie
set -o pipefail # propager les erreurs dans les pipes

echo "Début du script"
# ... commandes ...
echo "Terminé"

Rendre un script exécutable et le lancer

chmod +x mon-script.sh
./mon-script.sh

# ou sans le rendre exécutable :
bash mon-script.sh

Variables et paramètres

Variables

NOM="Alice"                 # affectation (pas d'espaces autour de =)
echo $NOM                   # utiliser la variable
echo "${NOM}s"              # délimiter le nom de variable : affiche "Alices"
echo '$NOM'                 # guillemets simples : pas d'interpolation → $NOM

readonly VERSION="1.0.0"    # variable en lecture seule
unset NOM                   # supprimer une variable

Paramètres du script

$0          # nom du script
$1, $2 ...  # arguments positionnels
$@          # tous les arguments (liste)
$#          # nombre d'arguments

# Exemple :
./deploy.sh prod v1.2.0
# $1 = "prod", $2 = "v1.2.0", $# = 2

Substitution et valeurs par défaut

echo ${NOM:-"inconnu"}      # utilise "inconnu" si NOM est vide ou non défini
echo ${NOM:="inconnu"}      # assigne "inconnu" si NOM est vide ou non défini
NOM_UPPER=${NOM^^}          # convertir en majuscules (bash 4+)
NOM_LOWER=${NOM,,}          # convertir en minuscules (bash 4+)

Conditions et boucles

if / elif / else

if [ condition ]; then
    echo "vrai"
elif [ autre_condition ]; then
    echo "autre"
else
    echo "faux"
fi

Opérateurs de test courants

# Fichiers
[ -f fichier ]      # existe et est un fichier
[ -d dossier ]      # existe et est un dossier
[ -e chemin ]       # existe (fichier ou dossier)
[ -x fichier ]      # est exécutable

# Chaînes
[ -z "$var" ]       # chaîne vide
[ -n "$var" ]       # chaîne non vide
[ "$a" = "$b" ]     # égalité de chaînes
[ "$a" != "$b" ]    # inégalité

# Nombres
[ $a -eq $b ]       # égal
[ $a -ne $b ]       # différent
[ $a -lt $b ]       # inférieur
[ $a -gt $b ]       # supérieur

Boucle for

for i in 1 2 3 4 5; do
    echo "Valeur : $i"
done

# Sur une plage
for i in {1..10}; do echo $i; done

# Sur des fichiers
for fichier in *.txt; do
    echo "Traitement de $fichier"
done

# Sur les arguments du script
for arg in "$@"; do
    echo "$arg"
done

Boucle while

compteur=0
while [ $compteur -lt 5 ]; do
    echo "Compteur : $compteur"
    ((compteur++))
done

# Lire un fichier ligne par ligne
while IFS= read -r ligne; do
    echo "$ligne"
done < fichier.txt

case

case "$1" in
    start)
        echo "Démarrage..."
        ;;
    stop)
        echo "Arrêt..."
        ;;
    restart)
        echo "Redémarrage..."
        ;;
    *)
        echo "Usage : $0 {start|stop|restart}"
        exit 1
        ;;
esac

Fonctions

# Déclaration
ma_fonction() {
    local param1="$1"       # variable locale à la fonction
    local param2="$2"
    echo "Paramètres : $param1, $param2"
    return 0                # code de retour (0 = succès, 1+ = erreur)
}

# Appel
ma_fonction "hello" "world"

# Vérifier le code de retour
if ! ma_fonction "test"; then
    echo "La fonction a échoué"
fi

Récupérer une valeur de retour

Bash ne peut retourner que des entiers via return. Pour retourner une chaîne, utiliser echo et capturer avec $() :

obtenir_date() {
    echo "$(date +%Y-%m-%d)"
}

AUJOURD_HUI=$(obtenir_date)
echo "Nous sommes le $AUJOURD_HUI"

Codes de retour

commande
echo $?         # 0 = succès, autre = erreur

# Convention
exit 0          # fin de script avec succès
exit 1          # fin de script avec erreur