- 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
- 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}
- 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"
- 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"
- 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"
- 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
- 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
- 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[@]}"
- 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
- 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.