Guide complet du shell Bash

  1. Introduction au shell

1.1 Commandes essentielles

1.1.1 Filtrage d'information

Raccourcis clavier du shell

Exécution de commande :
  !!                     Réexécute la dernière commande
  !num                   Exécute la commande historique numéro num
  Ctrl + R               Recherche dans l'historique

Navigation dans la ligne de commande :
  Ctrl + A               Début de ligne
  Ctrl + E               Fin de ligne
  Ctrl + K               Supprimer jusqu'à la fin de ligne
  Ctrl + U               Supprimer jusqu'au début de ligne
  Ctrl + Y               Coller le contenu supprimé
  Ctrl + C               Interrompre la commande
  Esc + B                Mot précédent
  Esc + F                Mot suivant

Commande grep

grep filtre les lignes correspondant à un motif.

grep [options] 'motif' fichier
Options :
  -i : ignore la casse
  -v : sélectionne les lignes ne correspondant pas
  -w : mot entier
  -c : compte les occurrences
  -n : affiche les numéros de ligne
  -r : recherche récursive dans les répertoires
  -A n : affiche n lignes après
  -B n : affiche n lignes avant
  -C n : affiche n lignes avant et après
  -l : liste les fichiers correspondants
  -e : utilise une expression régulière
  -E : utilise les expressions régulières étendues
  --color=auto : colorise les correspondances

Exemples :
# grep -i root /etc/passwd
# grep -w ftp /etc/passwd
# grep -c ^root /etc/passwd
# grep -E '^[a-z]+:' /etc/passwd

1.1.2 Tri et transformation

Commande sort

sort [options] fichier
Options :
  -u : supprime les doublons
  -r : ordre décroissant
  -n : tri numérique
  -t : séparateur de champs
  -k : colonne
  -b : ignore les espaces

Exemples :
# sort -n nombres.txt
# sort -u -n nombres.txt
# sort -t: -k3 -n /etc/passwd

1.1.3 Découpage et transformation

Commande cut

cut -d ':' -f 1,3 /etc/passwd
cut -c 1-5 fichier

Commande tr

echo "hello" | tr 'a-z' 'A-Z'
cat fichier | tr -d ' '    # supprime les espaces

Commande uniq

uniq [options] fichier
  -c : compte les occurrences
  -d : affiche les lignes répétées
  -u : lignes uniques

1.1.4 Combinaison d'informations

Commande paste

paste fichier1 fichier2
paste -d ':' fichier1 fichier2

Commande xargs

xargs [options] commande
  -n 1 : un argument par exécution
  -I {} : utiliser {} comme placeholder

# ls *.txt | xargs -I {} cp {} /backup/{}.bak

1.2 Bases du shell

1.2.1 Qu'est-ce que le shell ?

Le shell est un interpréteur de commandes situé entre le système d'exploitation et l'utilisateur. Il traduit les commandes en actions système.

1.2.2 Types de shell

Graphique (GUI) ou en ligne de commande (CLI). Sous Linux, les shells courants sont sh, bash, csh, ksh, zsh.

# Afficher le shell actuel
echo $SHELL
# Afficher les shells disponibles
cat /etc/shells
# Changer de shell pour un utilisateur
chsh -s /bin/zsh

1.2.3 Scripts shell

Un script shell est un fichier contenant une série de commandes exécutables.

#!/bin/bash
# Commentaire
echo "Hello, world!"

1.2.4 Exécution d'un script

# Méthode 1 : bash
bash script.sh
# Méthode 2 : chemin absolu
./script.sh   (nécessite chmod +x)
# Méthode 3 : source
source script.sh
# Méthode 4 : pipe
cat script.sh | bash

1.2.5 Débogage

bash -n script.sh   # vérification syntaxique
bash -v script.sh   # mode verbeux
bash -x script.sh   # trace des commandes

1.2.6 Bonnes pratiques

  • Nom de fichier significatif, extension .sh
  • En-tête avec #!/bin/bash
  • Commentaires en anglais
  • Indentation cohérente
  • Écrire les paires de symboles () {} [] '' "" simultanément
  1. Variables

2.1 Notions fondamentales

2.1.1 Définition de variable

Une variable stocke une valeur. Syntaxe : nom=valeur. Pas d'espace autour de =.

nom="Jean"
age=25
echo $nom a $age ans

2.1.2 Types de variables

  • Locale : accessible uniquement dans le terminal courant
  • Globale (environnement) : accessible à tous les processus fils
  • Intégrée : fournie par le shell (ex: $?, $0, $#)

2.1.3 Opérations de base

# Déclaration
ma_var="valeur"
# Lecture
echo $ma_var
# Suppression
unset ma_var
# Variable en lecture seule
readonly pi=3.14

2.2 Variables locales

2.2.1 Variables normales

# Sans guillemets
nom=Jean
# Guillemets simples : pas d'interpolation
nom='Jean'
# Guillemets doubles : interpolation
prenom=$nom
echo "Bonjour $prenom"   # Bonjour Jean

2.2.2 Variables de commande

# Avec backticks
utilisateur=`whoami`
# Avec $()
repertoire=$(pwd)
echo "Vous êtes $utilisateur dans $repertoire"

2.3 Variables globales

2.3.1 Définition et visualisation

# Définir une variable locale puis l'exporter
export ma_var="valeur"
# Ou directement
export PATH=$PATH:/mon/chemin
# Voir toutes les variables d'environnement
env
printenv

2.3.2 Fichiers de configuration

Les variables peuvent être définies dans :

  • ~/.bashrc, ~/.bash_profile (utilisateur)
  • /etc/profile, /etc/profile.d/*.sh (système)
echo 'export MA_VAR="test"' >> ~/.bashrc
source ~/.bashrc

2.3.3 Héritage et sous-shell

Une variable exportée est héritée par les processus fils. Les modifications dans un sous-shell n'affectent pas le parent.

export VAR="parent"
bash -c 'echo $VAR; VAR="enfant"; echo $VAR'
echo $VAR   # parent

2.4 Variables intégrées

2.4.1 Variables liées au script

$0 : nom du script
$1, $2, ... : paramètres positionnels
$# : nombre de paramètres
$? : code de retour de la dernière commande
$@ : tous les paramètres (chaque paramètre séparé)
$* : tous les paramètres (un seul mot)
$$ : PID du processus en cours
$! : PID du dernier processus lancé en arrière-plan

2.4.2 Manipulation de chaînes

# Longueur
chaine="hello"
echo ${#chaine}   # 5
# Sous-chaîne
echo ${chaine:1:3}   # ell
# Défaut
echo ${var:-default}

  1. Formatage du contenu

3.1 Symboles courants

3.1.1 Redirection

# Redirection de sortie (écrasement)
echo "texte" > fichier
# Redirection de sortie (ajout)
echo "texte" >> fichier
# Redirection d'entrée
commande < fichier
# Redirection d'erreur
commande 2> fichier_erreur
# Tout rediriger
commande &> fichier

3.1.2 Pipe

commande1 | commande2
# Exemple : ps aux | grep bash

3.1.3 Exécution en arrière-plan

commande &
# Exemple : sleep 10 &

3.1.4 Codes de sortie

0 : succès
1 : erreur générale
2 : utilisation incorrecte
127 : commande introuvable

3.2 Entrée formatée

3.2.1 Heredoc (EOF)

cat << EOF
Ligne 1
Ligne 2
EOF

Utilisation avec variables :

cat << EOF
Bonjour $nom
EOF

3.2.2 Ecriture de fichiers avec heredoc

cat > fichier.conf << EOF
serveur {
  port 8080;
  nom "exemple";
}
EOF

3.2.3 Commande tee

echo "test" | tee fichier1 fichier2
# Affiche et écrit dans les fichiers

3.3 Sortie formatée

3.3.1 echo

echo -e "Texte avec \n retour à la ligne"
echo -n "Pas de retour à la ligne"

3.3.2 Couleurs

echo -e "\033[31m Texte rouge \033[0m"
echo -e "\e[32m Vert \e[0m"

3.3.3 printf

printf "Nom: %s, Age: %d\n" "Jean" 25
printf "%-10s %-10s\n" "Nom" "Prénom"

  1. Interaction avec le script

4.1 read

read -p "Entrez votre nom: " nom
read -s -p "Mot de passe: " mdp
read -t 5 -p "Temps limité: " var
read -n 1 -p "Une touche: " touche

4.2 Exemple de login simulé

#!/bin/bash
clear
echo "Bienvenue"
read -p "Login: " login
read -s -p "Mot de passe: " pass
echo
echo "Login: $login, Mot de passe: $pass"

  1. Expressoins et opérateurs

5.1 Opérateurs arithmétiques

# Avec $[]
echo $[ 5 + 3 ]
# Avec let
let a=5+3
# Avec $(())
echo $(( 5 * 3 ))
# Avec expr
expr 5 + 3
# Avec bc (pour les flottants)
echo "scale=2; 10/3" | bc

5.2 Opérateurs d'affectation

a=10
a=$((a+5))   # a=15
a+=5          # a=20
a++           # a=21

5.3 Expressions logiques et de test

5.3.1 Test avec [ ]

[ "$a" -eq "$b" ]    # égalité numérique
[ "$a" != "$b" ]     # différence chaîne
[ -f "$fichier" ]    # fichier existe
[ -d "$repertoire" ] # répertoire existe
[ -z "$var" ]        # chaîne vide
[ -n "$var" ]        # chaîne non vide

5.3.2 Test avec [[ ]]

[[ $a == "valeur" ]]     # égalité chaîne
[[ $a =~ ^[0-9]+$ ]]    # regex
[[ $a -gt 5 && $b -lt 10 ]]  # ET logique

5.3.3 Test numérique

-eq, -ne, -lt, -le, -gt, -ge

5.3.4 Opérateurs logiques

# && (ET)
[ -f fichier ] && echo "existe"
# || (OU)
[ -d rep ] || echo "n'existe pas"
# ! (NON)
[ ! -f fichier ] && echo "fichier manquant"

  1. Tableaux

6.1 Définition

# Tableau indexé
tab=(val1 val2 val3)
# Tableau associatif (déclarer avec -A)
declare -A tab2
tab2["nom"]="Jean"

6.2 Accès

echo ${tab[0]}       # premier élément
echo ${tab[@]}       # tous les éléments
echo ${#tab[@]}      # nombre d'éléments
echo ${!tab[@]}      # indices

6.3 Modification

tab[1]="nouvelle_valeur"
unset tab[2]          # supprimer un élément
unset tab             # supprimer tout le tableau

  1. Structures de contrôle

7.1 if

if [ condition ]; then
  commandes
elif [ autre_condition ]; then
  commandes
else
  commandes
fi

7.2 case

case $var in
  "valeur1")
    commandes;;
  "valeur2")
    commandes;;
  *)
    commandes par défaut;;
esac

7.3 for

# Avec liste
for i in 1 2 3; do
  echo $i
done
# Avec séquence
for i in {1..5}; do
  echo $i
done
# Style C
for ((i=0; i<5; i++)); do
  echo $i
done

7.4 while

while [ condition ]; do
  commandes
done

7.5 until

until [ condition ]; do
  commandes
done

7.6 select

select choix in "Option1" "Option2"; do
  echo "Vous avez choisi $choix"
  break
done

7.7 Contrôle de boucle

break      # sortir de la boucle
continue   # passer à l'itération suivante
exit       # quitter le script

  1. Fonctions

8.1 Définition

# Syntaxe 1
function ma_fonction {
  commandes
}
# Syntaxe 2
ma_fonction() {
  commandes
}

8.2 Appel

ma_fonction
ma_fonction arg1 arg2

8.3 Valeur de retour

ma_fonction() {
  return 0   # 0-255
}
ma_fonction
echo $?      # 0

8.4 Variables locales

ma_fonction() {
  local var="locale"
  echo $var
}

8.5 Passage de tableau

mon_tableau=(1 2 3)
traiter_tableau() {
  local arr=("$@")
  echo ${arr[0]}
}
traiter_tableau "${mon_tableau[@]}"

  1. Scripts avancés

9.1 Gestion des signaux

trap "echo 'Signal reçu'" SIGINT SIGTERM
trap "nettoyage" EXIT

9.2 Expect

#!/usr/bin/expect
spawn ssh user@host
expect "password:"
send "monmotdepasse\r"
interact

9.3 Expressions régulières

# Avec grep
grep -E '^[0-9]+$' fichier
# Avec sed
sed -r 's/([0-9]+)/\1/g' fichier
# Avec awk
awk '/^[0-9]+$/{print}' fichier

9.4 sed

# Remplacer
sed -i 's/ancien/nouveau/g' fichier
# Supprimer
sed -i '/^#/d' fichier
# Imprimer
sed -n '2p' fichier

9.5 awk

# Afficher des colonnes
awk '{print $1, $3}' fichier
# Avec condition
awk '$3 > 10 {print $1}' fichier
# Avec BEGIN/END
awk 'BEGIN{print "Début"} {print} END{print "Fin"}' fichier

  1. Automatisation (déploiement)

10.1 Script de déploiement simple

#!/bin/bash
# Variables
APP_DIR="/opt/app"
BACKUP_DIR="/backup/app"
DATE=$(date +%Y%m%d%H%M%S)
# Fonction de déploiement
deploy() {
  echo "Déploiement en cours..."
  # 1. Récupération des sources
  git pull origin main
  # 2. Sauvegarde
  cp -r $APP_DIR $BACKUP_DIR/app_$DATE
  # 3. Installation
  cd $APP_DIR
  make install
  # 4. Redémarrage
  systemctl restart monapp
  echo "Déploiement terminé"
}
# Verrouillage
LOCK_FILE="/tmp/deploy.lock"
if [ -f $LOCK_FILE ]; then
  echo "Déploiement déjà en cours"
  exit 1
fi
touch $LOCK_FILE
deploy
rm -f $LOCK_FILE

10.2 Gestion des logs

LOG_FILE="/var/log/deploy.log"
log() {
  echo "$(date +%F_%T) - $1" >> $LOG_FILE
}
log "Début du déploiement"

Conclusion

Ce guide couvre les concepts fondamentaux du shell Bash : commandes de base, variables, structures de contrôle, fonctions, expressions régulières, et automatisation. La pratique régulière et l'exploration de cas concrets permettront de maîtriser ces outils.

Étiquettes: bash Shell Linux scripting grep

Publié le 14 août à 08h51