4 min read

Documentation d'utilisation de Bash

BASH user manual

Syntaxe de base

Les scripts Bash commencent généralement par une ligne shebang pour spécifier l'interpréteur :

#!/bin/bash

Les variables sont assignées sans espaces autour du signe = :

nom_variable="valeur"

Pour accéder à la valeur d'une variable, utilisez le symbole $ :

echo $nom_variable
  • Liste des variables système courantes
    • $(pwd) : Le répertoire de travail actuel.
    • $LOGNAME : Nom de l'utilisateur connecté, resistant à su.
    • $USER : Nom de l'utilisateur courante, peut-être affecté par su.
    • $HOME : Répertoire personnel de l'utilisateur.
    • $PATH : Liste des répertoires où chercher les exécutables.
    • $SHELL : Chemin de l'interpréteur de commandes utilisé.
    • $HOSTNAME : Nom de l'hôte de la machine.
    • $RANDOM : Génère un nombre aléatoire.
    • $? : Code de retour de la dernière commande exécutée.
    • arguments passés au script
      • $# : Nombre d'arguments passés au script.
      • $0 : Nom du script en cours d'exécution.
      • $@ : Tous les arguments passés au script.
      • $1, $2, ... : Arguments individuels passés au script.

Gestion des sorties

Opérateur Description
><fichier> Redirige la sortie standard vers un fichier
2> Redirige les erreurs standard vers un fichier
2>&1 Redirige les erreurs standard vers la sortie standard
&> Redirige les sorties standard et les erreurs vers un fichier
>> Ajoute la sortie standard à un fichier
2>> Ajoute les erreurs standard à un fichier
&>> Ajoute les sorties standard et les erreurs à un fichier

Utilisez /dev/null, le trou noir de Linux, pour ignorer les sorties.

Tableaux

Description Exemple de code
Définir un tableau nom_tableau=(valeur1 valeur2 valeur3)
Accéder à un élément (index 0) echo ${nom_tableau[0]}
Obtenir tous les éléments echo ${nom_tableau[@]}
Obtenir la longueur d'un tableau echo ${#nom_tableau[@]}

Dictionnaires (Tableaux associatifs)

Les dictionnaires (ou tableaux associatifs) en Bash permettent de stocker des paires clé-valeur. Vous devez déclarer le tableau comme associatif avant de l'utiliser :

declare -A nom_dict=(
    [cle1]="valeur1"
    [cle2]="valeur2"
)

Pour ajouter des paires clé-valeur au dictionnaire :

nom_dict[cle3]="valeur3"
nom_dict[cle4]="valeur4"

Pour accéder à une valeur par sa clé :

echo ${nom_dict[cle1]}  # Affiche : valeur1

Pour obtenir toutes les clés du dictionnaire :

echo ${!nom_dict[@]}  # Affiche : cle1 cle2 cle3 cle4

Pour obtenir toutes les valeurs du dictionnaire :

echo ${nom_dict[@]}  # Affiche : valeur1 valeur2 valeur3 valeur4

Instructions conditionnelles

if, elif, else

L'instruction if exécute du code conditionnellement :

if [ condition ] || [condition]; then
    # code à exécuter si la condition est vraie
elif [ autre_condition1 ] && [ autre_condition2 ]; then
    # code à exécuter si autre_condition est vraie
else
    # code à exécuter si aucune condition n'est vraie
fi

Conditions courantes pour les instructions if

Voici quelques conditions courantes que vous pouvez utiliser dans les instructions if :

Condition Exemple de code
Vérifier si un répertoire existe if [ -d repertoire ]; then
Vérifier si un fichier existe if [ -e fichier ]; then
Vérifier si une chaîne est vide if [ -z "$chaine" ]; then
Vérifier si une chaîne n'est pas vide if [ -n "$chaine" ]; then
Comparer deux nombres if [ "$nb1" -eq "$nb2" ]; then
Vérifier si un nombre est supérieur if [ "$nb1" -gt "$nb2" ]; then
Vérifier si un nombre est inférieur if [ "$nb1" -lt "$nb2" ]; then
La commande précedent a terminé avec succes if [ $? -eq 0 ]; then

for pkg in "${packages[@]}"; do
    if echo "$installed" | grep -q "$pkg"; then
        read -p "Désinstallation de : $pkg?(o/n)" choice
        if [ "$choice" = "o" ] || [ "$choice" = "O" ]; then
            adb shell pm uninstall "$pkg" &>/dev/null
            if adb shell pm uninstall "$pkg" &>/dev/null; then
                echo "✅ $pkg est désinstallé."
            elif adb shell pm uninstall --user 0 "$pkg" &>/dev/null; then
                echo "✅ Scamsung/Google empêche le déinstallation complète de $pkg. Il sera désinstallé pour utilisateur 0 seulement."
            elif adb shell pm disable-user --user 0 "$pkg" &>/dev/null; then
                echo "✅ $pkg ne peut pas être désinstallé et plutôt désactivé."
            else
                echo " Malheureusement Scamsung/Google empêche le déinstallation/désactivition de $pkg"
            fi
        fi
    fi
done

Instructions case

L'instruction case permet d'exécuter du code en fonction d'une correspondance de modèle. Elle est utile lorsque vous avez plusieurs conditions à vérifier.

Exemple :

read -p "Entrez un nombre entre 1 et 3 : " nombre
case $nombre in
    1)
        echo "Vous avez entré un."
        ;;
    2)
        echo "Vous avez entré deux."
        ;;
    3)
        echo "Vous avez entré trois."
        ;;
    *)
        echo "Nombre invalide."
        ;;
esac

Boucles

Boucle for

La boucle for itère sur une liste d'éléments :

for <variable> in <groupe>*; do
    <commandes>
done

Exemples :

for fichier in *.txt *.png; do
    # commandes à exécuter pour chaque fichier .txt et .png
done
for i in {1..5}; do
    echo "Nombre : $i"
done
fruits=("pomme" "banane" "cerise")
legumes=("concombre" "aubergine" "courgette")
for frais in "${fruits[@]}" "${legumes[@]}"; do
    echo "Produit frais : $frais"
done

Boucle while

La boucle while exécute du code tant qu'une condition est vraie :

while [ condition ]; do
    # code à exécuter
done

Exemple :

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

Ceci est essentiellement une boucle for avec un compteur personnalisé.

ligne_compteur=1
while IFS= read -r ligne; do
    echo "Ligne $ligne_compteur : $ligne"
    ((ligne_compteur++))
done < fichier.txt

Cette boucle while lit fichier.txt ligne par ligne.

fichier.txt est la cible de la boucle, alimentée par <.

IFS= n'est pas une affectation de variable. Cela spécifie que les séparateurs de champs internes (\s, \t, etc.) ne doivent pas être ignorés.

read ligne lit un fichier ligne par ligne et stocke chaque ligne temporairement comme $ligne. -r spécifie que les \ doivent être interprétés littéralement et non comme des caractères d'échappement.

Sorties

# Rediriger la sortie standard vers un fichier
commande > sortie.txt

# Rediriger les erreurs standard vers un fichier
commande 2> erreurs.txt

# Rediriger à la fois la sortie standard et les erreurs standard vers le même fichier
commande &> sortie_et_erreurs.txt

# Ajouter la sortie standard à un fichier
commande >> sortie.txt

# Ajouter les erreurs standard à un fichier
commande 2>> erreurs.txt

# Ajouter à la fois la sortie standard et les erreurs standard au même fichier
commande &>> sortie_et_erreurs.txt

sudo ls > /root/fichier #❌ C'est sudo qui est redirigé

Functions simple

echo()

Option Description
-n Supprime le saut de ligne à la fin de la sortie.
-e Interprète les séquences d'échappement comme \n, \t, etc.

eval()

eval (ssh-agent -s)

read (input utilisateur)

read -p "Do you want to install $app? (y/n) " choice
    if [ "$choice" = "y" ]; then
        install+=("$app")
    fi

Plus

Pour plus, rendez-vous sur Linux Terminal