all:bibles:langages:shell
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| all:bibles:langages:shell [2025/08/12 07:52] – [Tableaux] omeylhoc | all:bibles:langages:shell [2025/08/20 10:02] (Version actuelle) – omeylhoc | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ====== Shell ====== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Sécurisation exécution ===== | ||
| + | |||
| + | ==== set ==== | ||
| + | |||
| + | | set -o pipefail | Permet de retourner une erreur quand la première partie d'un pipe est en erreur | ||
| + | | set -o errexit (ou set -e) | Force l' | ||
| + | | set -o nounset (ou set -u) | Sort en erreur si une variable est utilisée sans avoir été déclarée préalablement | ||
| + | | set -o errtrace (ou set -E) | | | ||
| + | | set -x | Mode debug, chaque ligne est affichée lors de l' | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Variables ===== | ||
| + | |||
| + | ==== Paramètres ==== | ||
| + | |||
| + | | $0 | Nom de la commande en cours d' | ||
| + | | $1..$9 | ||
| + | | $# | Nombre d' | ||
| + | | $* | Liste des arguments (sauf $0) en 1 seul argument en utilisant le séparateur $IFS ("$1 $2 $3 …$n" | ||
| + | | $@ | Liste des arguments (sauf $0) en n arguments (" | ||
| + | | Shift | Décale les arguments à gauche, $0 inchangé, $1 perdu, $2 passe dans $1… | | ||
| + | |||
| + | ==== Entrées/ | ||
| + | |||
| + | * 0 : entrée standard | ||
| + | * 1 : sortie standard | ||
| + | * 2 : sortie d' | ||
| + | |||
| + | === Exemples === | ||
| + | |||
| + | <code bash> | ||
| + | 1>/ | ||
| + | 2>/ | ||
| + | 1>&2 : redirige < | ||
| + | </ | ||
| + | |||
| + | ==== Variables prédéfinies ==== | ||
| + | |||
| + | | $? | Code de retour dernière commande (0 à 255). Code nul = vrai, sinon faux | | ||
| + | | $$ | Numéro de processus en cours d' | ||
| + | | $! | Numéro du dernier processus lancé en tâche de fond | | ||
| + | | $_ | paramètre le plus récent (ou le chemin abs de la commande pour démarrer le shell courant immédiatement après le démarrage) | ||
| + | | $- | options actuelles définies pour le shell | | ||
| + | | $FUNCNAME | ||
| + | | $LINENO | ||
| + | | $IFS | Internal Field Separator (utile pour les boucles : IFS=$’\n’) | ||
| + | | ~dp0 | Répertoire où se situe le script en cours d' | ||
| + | | %CD% | Répertoire courant | ||
| + | |||
| + | [[https:// | ||
| + | [[https:// | ||
| + | [[https:// | ||
| + | |||
| + | === Bash === | ||
| + | |||
| + | | PS1 | Prompt par défaut de la ligne de commande | ||
| + | | PS2 | Prompt pour les commandes sur plusieurs lignes suite à \. Par défaut affiche "> " sur les lignes suivantes | ||
| + | | PS3 | Prompt pour les boucles select | ||
| + | | PS4 | Prompt pour l' | ||
| + | | PROMPT_COMMAND | ||
| + | [[https:// | ||
| + | |||
| + | ==== Alias ==== | ||
| + | |||
| + | | \!* | désigne la liste des paramètres | ||
| + | | %%\!^%% | ||
| + | | \!$ | désigne le dernier paramètre | ||
| + | | \!:n | désigne le nième paramètre | ||
| + | |||
| + | ==== Tableaux ==== | ||
| + | |||
| + | <code bash> | ||
| + | tableau[0]=" | ||
| + | tableau[1]=" | ||
| + | autre_tableau=(" | ||
| + | |||
| + | ${# | ||
| + | ${!fruits[@]} donne la liste des indices du tableau (pour utilisation dans une boucle par exemple) | ||
| + | |||
| + | echo ${tableau[1]} | ||
| + | echo ${tableau[*]} # affiche tous les éléments | ||
| + | echo ${tableau[@]} # autre forme, même résultat | ||
| + | </ | ||
| + | |||
| + | ==== Calcul ==== | ||
| + | |||
| + | Incrémenter de 1 la variable $var: | ||
| + | |||
| + | <code bash> | ||
| + | TOTO=`expr $var + 1` | ||
| + | let " | ||
| + | ((var=var+1)) | ||
| + | ((var++)) | ||
| + | </ | ||
| + | |||
| + | ==== Formatage ==== | ||
| + | |||
| + | <code bash> | ||
| + | printf " | ||
| + | </ | ||
| + | |||
| + | ==== Shell parameter expansion ==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Manipulation de chaînes ===== | ||
| + | |||
| + | ==== Majuscule/ | ||
| + | |||
| + | <code bash> | ||
| + | texte_premiere_maj=" | ||
| + | texte_maj=" | ||
| + | texte_premiere_min=" | ||
| + | texte_min=" | ||
| + | </ | ||
| + | |||
| + | ==== Remplacement de caractère ==== | ||
| + | |||
| + | === ${variable// | ||
| + | |||
| + | <code bash> | ||
| + | # remplace ; par , | ||
| + | modif_variable=${variable//;/, | ||
| + | # enlever toutes les " dans une chaîne | ||
| + | modif_variable=${variable// | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Extraire une sous chaîne ==== | ||
| + | |||
| + | === Exemples === | ||
| + | |||
| + | var=banane | ||
| + | |||
| + | | %a* | plus petite chaîne commençant par a (ex : ${var%a*}=ban) | ||
| + | | < | ||
| + | | #*a | plus petite chaîne terminant par a (ex : ${var# | ||
| + | | ##*a | plus grande chaîne terminant par a (ex : ${var## | ||
| + | |||
| + | === Utilisation d'un séparateur === | ||
| + | |||
| + | <code bash> | ||
| + | var=" | ||
| + | IFS=: | ||
| + | set var | ||
| + | # var devient param1 param2 | ||
| + | param1=$1 | ||
| + | param2=$2 | ||
| + | </ | ||
| + | |||
| + | ==== Expressions régulières ==== | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | === Syntaxe === | ||
| + | |||
| + | <code bash> | ||
| + | if [[ $VALEUR =~ regex ]]; then | ||
| + | echo " | ||
| + | else | ||
| + | echo " | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | === Capture === | ||
| + | |||
| + | Les variables sont ${BASH_REMATCH[1]} à ${BASH_REMATCH[n]} au lieu de $1 à $n | ||
| + | |||
| + | === Vérification expression régulière === | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | === Source === | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ==== Lire un fichier csv ==== | ||
| + | |||
| + | <code bash> | ||
| + | # définir le séparateur , ou ; | ||
| + | IFS=, | ||
| + | while read -r colonne1 colonne2 colonne3; do | ||
| + | echo $colonne1 | ||
| + | echo $colonne2 | ||
| + | echo $colonne3 | ||
| + | done < $fichier_csv | ||
| + | </ | ||
| + | |||
| + | ==== Construire une commande dans une variable ==== | ||
| + | |||
| + | Pour construire une commande à exécuter dans une variable il faut utiliser un tableau pour éviter des problèmes avec les ' ou ". | ||
| + | |||
| + | <code bash> | ||
| + | # ne pas faire | ||
| + | USER=" | ||
| + | IP=" | ||
| + | OPT=" | ||
| + | CMD=" | ||
| + | ssh $CMD | ||
| + | |||
| + | # utiliser un tableau à la place | ||
| + | CMD=(-o StrictHostKeyChecking=no toto@192.168.0.1) | ||
| + | ssh ${CMD[@]} | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Tests ===== | ||
| + | |||
| + | ==== Opérateurs ==== | ||
| + | |||
| + | | ! | négation d’une expression | ||
| + | | -a | et logique | ||
| + | | -o | ou logique (le et logique a une préséance plus grande) | ||
| + | | \(expr\) | ||
| + | |||
| + | ==== Fichiers ==== | ||
| + | |||
| + | | -r | vrai si le fichier existe et accessible en lecture pour l’utilisateur | ||
| + | | -w | vrai si le fichier existe et accessible en écriture pour l’utilisateur | ||
| + | | -x | vrai si le fichier existe et accessible en exécution pour l’utilisateur | ||
| + | | -f | vrai si le fichier existe et est un fichier normal | ||
| + | | -d | vrai si le fichier existe et est un répertoire | ||
| + | | -c | vrai si le fichier existe et est du type spécial caractère | ||
| + | | -b | vrai si le fichier existe et est du type spécial bloc | | ||
| + | | -s | vrai si le fichier existe et a une taille non nulle | | ||
| + | | -L | vrai si le fichier est un lien | | ||
| + | | -e | vrai si fichier régulier ou lien | | ||
| + | |||
| + | ==== Chaînes de caractères ==== | ||
| + | |||
| + | | -z s1 | vrai si la chaîne s1 est de longueur nulle | | ||
| + | | -n s1 | vrai si la chaîne s1 contient au moins un caractère | ||
| + | | s1=s2 | vrai si les 2 chaînes sont égales (attention aux blancs encadrant le signe %%=)%% | ||
| + | | s1!=s2 | ||
| + | | str | Vérifie si str n'est pas la chaîne vide; s'il est vide, il renvoie false | | ||
| + | |||
| + | ==== Entiers ==== | ||
| + | |||
| + | | -ne | différent | ||
| + | | -gt | supérieur | ||
| + | | -ge | supérieur ou égal | -le | inférieur ou égal | | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Fonctions ===== | ||
| + | |||
| + | ==== Fichiers ==== | ||
| + | |||
| + | | basename | ||
| + | | dirname | ||
| + | |||
| + | ==== Mathématique ==== | ||
| + | |||
| + | | + | Addition `expr a + b` | | ||
| + | | - | Soustraction `expr a - b` | | ||
| + | | * | Multiplication `expr a * b` | | ||
| + | | / | Division `expr a / b` | | ||
| + | | % | Modulo. Divise l' | ||
| + | |||
| + | ==== Saisie clavier : read ==== | ||
| + | |||
| + | === options === | ||
| + | |||
| + | * -p : affiche un prompt | ||
| + | * -s : mode silencieux (n' | ||
| + | * -t : définit un délai d' | ||
| + | * -a : stocke les entrées dans un tableau | ||
| + | * -n : limite le nombre de caractères à lire | ||
| + | * -r : mode raw (n' | ||
| + | |||
| + | === exemples === | ||
| + | |||
| + | <code bash> | ||
| + | # lecture simple | ||
| + | echo " | ||
| + | read nom | ||
| + | echo $nom | ||
| + | |||
| + | # lecture avec prompt intégré | ||
| + | read -p " | ||
| + | echo " | ||
| + | |||
| + | # lecture silencieuse pour mot de passe | ||
| + | read -sp " | ||
| + | |||
| + | # Lecture avec délai d' | ||
| + | read -t 5 -p "Vous avez 5 secondes pour répondre : " reponse | ||
| + | |||
| + | # Lecture de plusieurs variables | ||
| + | read -p " | ||
| + | echo " | ||
| + | |||
| + | # Lecture d'un tableau | ||
| + | read -a tableau -p " | ||
| + | echo " | ||
| + | echo " | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | |||
| + | ===== Structures de contrôle ===== | ||
| + | |||
| + | ==== Prise de décision ==== | ||
| + | |||
| + | === if === | ||
| + | |||
| + | <code bash> | ||
| + | if [ expression ] | ||
| + | then | ||
| + | | ||
| + | else | ||
| + | | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | if [ expression 1 ] | ||
| + | then | ||
| + | | ||
| + | elif [ expression 2 ] | ||
| + | then | ||
| + | | ||
| + | elif [ expression 3 ] | ||
| + | then | ||
| + | | ||
| + | else | ||
| + | | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | === case === | ||
| + | |||
| + | <code bash> | ||
| + | option=" | ||
| + | case ${option} in | ||
| + | -f) FILE=" | ||
| + | echo "File name is $FILE" | ||
| + | ;; | ||
| + | -d) DIR=" | ||
| + | echo "Dir name is $DIR" | ||
| + | ;; | ||
| + | | ||
| + | echo " | ||
| + | exit 1 # Command to come out of the program with status 1 | ||
| + | ;; | ||
| + | esac | ||
| + | </ | ||
| + | |||
| + | ==== Boucles ==== | ||
| + | |||
| + | === Boucle while === | ||
| + | |||
| + | <code bash> | ||
| + | a=0 | ||
| + | while [ $a -lt 10 ] | ||
| + | do | ||
| + | echo $a | ||
| + | | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | === Boucle for === | ||
| + | |||
| + | <code bash> | ||
| + | for var in 0 1 2 3 4 5 6 7 8 9 | ||
| + | do | ||
| + | echo $var | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | for i in $(seq 0 9); do echo $i; done | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | fruits=(" | ||
| + | |||
| + | for fruit in " | ||
| + | echo " | ||
| + | done | ||
| + | for (( i=0; i< | ||
| + | echo "Fruit $i: ${fruits[$i]}" | ||
| + | done | ||
| + | for index in " | ||
| + | echo "Fruit $index: ${fruits[$index]}" | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | === Boucle until === | ||
| + | |||
| + | <code bash> | ||
| + | a=0 | ||
| + | until [ ! $a -lt 10 ] | ||
| + | do | ||
| + | echo $a | ||
| + | | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | === Boucle sélection === | ||
| + | |||
| + | Permet de créer un menu numéroté | ||
| + | |||
| + | <code bash> | ||
| + | PS3=" | ||
| + | select DRINK in tea cofee water juice appe all none | ||
| + | do | ||
| + | case $DRINK in | ||
| + | tea|cofee|water|all) | ||
| + | echo "Go to canteen" | ||
| + | ;; | ||
| + | juice|appe) | ||
| + | echo " | ||
| + | ;; | ||
| + | none) | ||
| + | | ||
| + | ;; | ||
| + | *) echo " | ||
| + | ;; | ||
| + | esac | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | === Contrôle de boucle === | ||
| + | |||
| + | | break | sort de l' | ||
| + | | continue | ||
| + | |||
| + | ==== Procédures/ | ||
| + | |||
| + | <code bash> | ||
| + | function maFonction() | ||
| + | { | ||
| + | ... | ||
| + | } | ||
| + | maFonction() | ||
| + | { | ||
| + | ... | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Les deux syntaxes ont leur avantage : | ||
| + | |||
| + | * L' | ||
| + | * La présence du mot-clé permet d' | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Commandes ===== | ||
| + | |||
| + | ==== Nom de fichier ==== | ||
| + | |||
| + | === basename === | ||
| + | |||
| + | Extraction du nom de fichier (ou repertoire) du chemin donné en entrée. En fait donne la chaîne après le dernier /. | ||
| + | |||
| + | === dirname === | ||
| + | |||
| + | Extraction de la partie répertoire du chemin donné en entrée | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Astuces ===== | ||
| + | |||
| + | ==== Créer un fichier sans éditeur ==== | ||
| + | |||
| + | <code bash> | ||
| + | cat << tagFIN > nomdufichier | ||
| + | .... | ||
| + | ... | ||
| + | tagFIN | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Sources ===== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | |||
| + | ---- | ||
