Polar Code 🎭

Command Palette

Search for a command to run...

07
Pièce N°07

La Logique des Ombres – Conditions et Décisions

Dans les bas-fonds du système, rien n’est jamais certain. Un fichier peut exister ou avoir disparu. Une variable peut être vide comme une balle perdue. Un compte peut être suffisant, ou pas. Avant d’agir, il faut vérifier. Interroger le réel. Poser des conditions. C’est ce qui sépare le script qui fonctionne du script qui se brise la gueule dans le silence d’une erreur fatale.

7.1 Tests et expressions

Trois façons de poser une question au système. Trois syntaxes pour un même verdict.

  • test : La vieille école. L’ancêtre discret.

    test -f "/home/noir/plan.txt"
    echo $?  # Affiche 0 si le fichier existe, autre chose sinon.
    
  • [ ] : L’allié synthétique. C’est en réalité une commande qui s’appelle test, mais cachée dans des crochets. Espaces obligatoires.

    [ -f "/home/noir/plan.txt" ]
    if [ $? -eq 0 ]; then
        echo "Le plan est en place."
    fi
    
  • [[ ]] : La version améliorée, exclusive à Bash. Plus puissante, plus sûre, moins capricieuse avec les variables vides. Elle comprend plus d’opérateurs.

    [[ -f "/home/noir/plan.txt" && "$USER" == "noir" ]]
    # On peut combiner avec && (ET) et || (OU) de façon plus naturelle.
    

    Préférez [[ ]] quand vous le pouvez. C’est le choix du professionnel.

7.2 Conditions sur :

  • Chaînes de caractères : Vérifier les mots, les noms, les passphrase.

    nom="$1"
    if [[ -z "$nom" ]]; then  # -z : Vrai si la chaîne est VIDE.
        echo "Erreur : Aucun nom fourni." >&2
        exit 1
    fi
    if [[ "$nom" == "Moriarty" ]]; then  # Comparaison exacte.
        echo "Accès refusé. Cible prioritaire."
    elif [[ "$nom" =~ ^[A-Z] ]]; then  # =~ : Correspondance par expression régulière (regex). Commence par une majuscule ?
        echo "Nom suspect détecté."
    fi
    
  • Nombres : Compter, comparer. Pas avec == ou <, mais avec des opérateurs spéciaux.

    nombre_tueurs=$2
    if [[ $nombre_tueurs -gt 3 ]]; then  # -gt : greater than (supérieur à).
        echo "Alarme. Groupe trop important."
    elif [[ $nombre_tueurs -eq 0 ]]; then  # -eq : equal (égal à).
        echo "Aucune menace directe."
    # Autres : -lt (inférieur), -ge (supérieur ou égal), -le (inférieur ou égal), -ne (différent).
    fi
    
  • Fichiers : Le pain quotidien du scripteur nocturne.

    chemin="/var/lock/operation.lock"
    if [[ -f "$chemin" ]]; then  # -f : Vrai si c'est un fichier régulier.
        echo "Un verrou est présent. L'opération est déjà en cours."
    fi
    if [[ -d "/home/noir/archives" ]]; then  # -d : Vrai si c'est un répertoire.
        echo "Le répertoire des archives existe."
    fi
    if [[ ! -e "/tmp/contact.txt" ]]; then  # -e : Vrai si le fichier/répertoire existe (quel qu'il soit). ! inverse la logique.
        echo "Le fichier contact a disparu. Il nous a lâchés."
    fi
    # Autres tests utiles : -s (fichier non vide), -r (lisible), -w (modifiable), -x (exécutable).
    

7.3 Structures conditionnelles

Les questions ne servent à rien sans les conséquences. C’est là que les structures orientent le flux.

  • if / elif / else : L’embranchement classique. Le choix binaire, ou multiple.

    #!/bin/bash
    niveau_alerte=$1
    
    if [[ "$niveau_alerte" -gt 7 ]]; then
        echo "[CRITIQUE] Évacuation immédiate. Effacez tout."
        rm -f /home/noir/dossier_chaud/*
    elif [[ "$niveau_alerte" -gt 4 ]]; then
        echo "[HAUTE] Renforcez les verrous. Surveillance active."
        chmod 600 /home/noir/*.conf
    elif [[ "$niveau_alerte" -ge 1 ]]; then
        echo "[BASSE] Veille standard. Gardez l'oreille."
    else
        echo "[INFO] Niveau non reconnu ou nul. Vérifiez la source."
        exit 2
    fi
    # Le script continue ici après le bloc conditionnel...
    
  • case : Le sélecteur. Parfait pour comparer une variable à une liste de valeurs précises, plus lisible qu’un enchaînement de if/elif.

    #!/bin/bash
    code_action=$1
    
    case "$code_action" in
        "R7A")
            echo "Action : Extraction silencieuse."
            # Commandes d'extraction...
            ;;
        "V2R")
            echo "Action : Neutralisation de la surveillance."
            # Commandes de brouillage...
            ;;
        "X99" | "KILL")  # Plusieurs valeurs possibles séparées par |
            echo "Action : Nettoyage total."
            # Commandes de nettoyage...
            ;;
        *)  # Le cas par défaut, si rien ne correspond.
            echo "Code d'action '$code_action' non reconnu. Abandon."
            exit 1
            ;;
    esac
    

    Chaque bloc se termine par ;;. Le *) est le joker, l’étrangleur par défaut.

Le code n’est plus une simple liste d’ordres. C’est un arbre de décision. Il sonde l’environnement, vérifie les prérequis, choisit sa branche en fonction des preuves glanées. C’est ce qui transforme un recueil d’ordres en un plan d’action intelligent, capable de s’adapter aux ombres mouvantes du système.

Une seule condition manquée, et c’est tout le scénario qui s’écroule. Vérifiez. Toujours vérifier.