Outils pour utilisateurs

Outils du site


informatique:bash

Bash

Bonnes pratiques

Variables d'environnement

Il est possible d'ajouter, de modifier et de supprimer des variables d'environnement qui peuvent être utilisées par le système ou les commandes lancées.

# Ajouter ou modifier une variable d'environnement
export <variable>=<value>
 
# Supprimer une variable d'environnement
unset <variable>
 
# Lancer une commande en modifiant localement la variable d'environnement
<variable>=<value> <command>

Dans certains contexte (cron par exemple), l'utilisateur qui lance la commande ne possède pas les mêmes variables d'environnement que l'utilisateur connecté. Pour identifier ce problème, il est possible de lancer la commande dans un environnement vierge avec la commande suivante :

# Version courte
env -i <command>
 
# Version longue
env --ignore-environment <command>

Dans le cas de cron, il est possible d'en extraire son environnement d'exécution et de le ré-utiliser pour le lancement manuel de la commande :

# Ajouter temporairement cette ligne dans cron pour générer le fichier d'environnement
* * * * * root env > ~/cronenv
 
# Lancer la commande en utilisant le contenu du fichier précédemment généré
env - $(<~/cronenv) /bin/sh <command>

Redirection

Les redirections permettent de stocker les sorties d'un programme dans un fichier. Si le fichier n'existe pas, celui ci est créé. Par défaut, seulement la sortie standard est stockée.

# Le contenu du fichier est supprimé avant la redirection
command > file
 
# Le contenu de la redirection est ajouté à la fin du fichier
command >> file

Il est possible également de stocker la sortie d'erreur dans un fichier :

# On stocke seulement les erreurs
command 2> error
# On stocke la sortie standard et les erreurs dans des fichiers différents
command 1> file 2> error
# On stocke la sortie standard et les erreurs dans le même fichier
command 2>&1 > file

Les redirections peuvent se faire n'importe où dans la commande1) :

# Toutes les commandes suivantes sont équivalentes
command arg1 arg2 > file
command arg1 > file arg2
command > file arg1 arg2
> file command arg1 arg2

Expansion

L'expansion des accolades2) permet à Bash d'interpréter le contenu des accolades pour exécuter les commandes. Ce n'est pas très clair comme ça mais quelques exemples simplifierons la compréhension.

# Listage nommé
# Création de fichier1, fichier3 et fichier8
touch fichier{1,3,8}
 
# Listage séquentiel
# Création de fichier1, fichier2, fichier3 et fichier4
touch fichier{1..4}
 
# Listage séquentiel avec incrément
# Création de fichier2, fichier4, fichier6 et fichier8
touch fichier{2..8..2}
 
# Listage séquentiel avec incrément et remplissage
# Création de fichier02, fichier04, fichier06, fichier08 et fichier10
touch fichier{02..10..2}

Ce comportement fonctionne aussi avec des lettres

# Listage nommé
# Création de fichierA, fichierC et fichierQ
touch fichier{A,C,Q}
 
# Listage séquentiel
# Création de fichierA, fichierB, fichierC et fichierD
touch fichier{A..D}
 
# Listage séquentiel avec incrément
# Création de fichierA, fichierC et fichierE
touch fichier{A..E..2}

Ce comportement est récursif

# Création de fichier0, fichier4, fichier5, fichier6, fichier7, fichier8, fichier10, fichier20 et fichier30
touch fichier{{0..30..10},4,{8..5..-1}}

Historique de commande

  • !! permet de répéter la dernière commande.
  • !n permet de répéter la nième commande depuis le début de l'historique.
  • !-n permet de répéter la nième commande depuis la fin de l'historique.
  • Alt + . permet d'ajouter le dernier argument de la dernière commande sans lancer la commande actuelle.
  • !$ permet d'ajouter le dernier argument de la dernière commande en lançant la commande actuelle.
  • !* permet d'ajouter tous les arguments de la dernière commande.
  • !foo ou foo !! permet de relancer la dernière commande commençant par foo.
  • !:- permet de récupérer la dernière commande sans le dernier argument.
  • :p permet d'afficher la commande sans qu'elle se lance.
  • !:n permet de récupérer le nième argument de la dernière commande.
  • :s/old/new/ permet de modifier la commande avant de la lancer.
  • ^old^new^ permet de modifier la dernière commande avant de la lancer.
# Lancement d'une commande de l'historique
!120
 
# Affichage d'une commande de l'historique
!120:p
 
# Affichage d'une commande modifiée de l'historique
!120:s/old/new/:p

Manipuler un tableau

  • Déclaration
# déclaration implicite élément par élément
tab[0]=valeur_1
tab[1]=valeur_2
tab[2]=valeur_3
 
# déclaration implicite de l'ensemble des valeurs
tab=(valeur_1 valeur_2 valeur_3)
 
# déclaratin explicite de l'ensemble des valeurs
declare -a tab=(valeur_1 valeur_2 valeur_3)
  • Ajouter un élément
# Au début du tableau
tab=(valeur_0 ${tab[@]})
 
# À la fin du tableau
tab=(${tab[@]} valeur_4)
  • Parcourir les éléments séquentiellement
for i in "${tab[@]}"
do
    # faire quelque chose
done
  • Récupérer le nombre d'éléments
echo ${#tab[@]}

Manipuler une chaîne de charactères

  • Ajout d'une valeur par défaut
${chaine:-default}
  • Extraction d'une sous-chaîne
# À partir d'une position jusqu'à la fin de la chaîne
${chaine:debut}
 
# À partir d'une position pour une longueur donnée
${chaine:debut:longueur}
  • Conversion en tableau
tableau=($chaine)
  • Extraire l'extension d'un fichier
extension=${chaine##*.}
  • Substituer une sous-chaîne par une autre
# Remplacement du premier points par un espace (attention à l'espace dans la chaîne de substitution)
${chaine/./ }
 
# Remplacement des points par des espaces (attention à l'espace dans la chaîne de substitution)
${chaine//./ }
  • Extraire une sous-chaîne par rapport à un séparateur
# Extraire avant le séparateur (|)
${chaine%|*}
 
# Extraire après le séparateur (|)
${chaine#*|}
  • Changer la casse
# Convertir le premier caractère en majuscule
${chaine^}
 
# Convertir tous les caractères en majuscule
${chaine^^}
 
# Convertir le premier caractère en minuscule
${chaine,}
 
# Convertir tous les caractères en minuscule
${chaine,,}
 
# Inverser la casse du premier caractère
${chaine~}
 
# Inverser la casse de tous les caractères
${chaine~~}

Manipuler des nombres

# Addition d'entiers
echo $((i + 3))
 
# Incrémentation d'une variable
((i++))
 
# Addition de réels
# Ce n'est pas supporté directement. Il faut passer par d'autres outils (awk, python, ...).
echo $(awk "BEGIN {print $i+3; exit}")
  • Changer de base
# Pour changer en base 10
echo $((10#$i))

Un nombre avec des 0 devant est considéré comme un nombre en octal. Lorsqu'il sera utilisé pour faire des additions, les résultats ne seront pas ceux attendus. Dans ce cas, il faut lire le nombre en décimal, ce qui as pour effet de supprimer les 0.

  • Afficher une séquence
# Affiche 1 2 3 4 5 6 7 8 9 10
for i in {1..10}; do
echo $i
done
 
# Affiche 01 02 03 04 05 06 07 08 09 10
for i in {01..10}; do
echo $i
done
# Cette méthode n'est à utiliser qu'avec une version de Bash antérieure à la 3.5
# Affiche 1 2 3 4 5 6 7 8 9 10
for i in `seq 1 10`; do
echo $i
done

Convertir une chaîne de caractères en tableau

Pour faire cela, il faut utiliser un délimiteur. Il faut faire attention à ce que la chaîne de caractères ne comporte pas d'espace sinon cette technique n'est pas valable.

# Conversion du premier délimiteur ("|") en " "
tableau=(${chaine/|/ })
 
# Conversion de tous les délimiteurs ("|") en " "
tableau=(${chaine//|/ })
 
# Les parenthèses indiquent qu'il faut traiter le contenu comme un tableau

Raccourcis clavier

Récupérer le retour de la dernière commande

echo $?

Fonction de conversion des pages de manuel

Dans le fichier .bashrc, il faut ajouter la fonction suivante :

man2pdf () {
  if whatis ${1} > /dev/null; then
    man -Tpdf ${1} > ${1}.pdf
  fi  
}

Formatage du texte

Pour formater du texte, il faut utiliser des séquences d'échappement. Ces séquences d'échappement sont composées du caractère d'échappement (représenté par <ESC>) suivi par une série de nombres séparés par des points-virgules et terminées par la lettre m. Voici quelques exemples :

# Notation en ascii
echo -e "\e[4;31;100mHello world\e[m"
 
# Notation en octal
echo -e "\033[4;31;100mHello world\033[m"
 
# Notation en hexa-décimal
echo -e "\x1B[4;31;100mHello world\x1B[m"

Chaque nombre a une fonction particulière et peut être combiné avec les autres. Cependant, il y a des combinaisons qui n'ont aucun sens.

Ajout d'attributs Suppression d'attributs
Code Effet Code Effet
1 Mettre en gras 0 Annuler tous les effets 5)
2 Réduire la luminosité 22 Annuler la réduction de luminosité
3 Mettre en italique 23 Annuler la mise en italique
4 Souligner avec un trait simple 24 Annuler le soulignement (simple ou double)
5 Faire clignoter 25 Annuler le clignotement
7 Inverser les couleurs 27 Annuler l'inversion des couleurs
8 Cacher 28 Annuler le cachement
9 Barrer 29 Annuler le barrement
21 Souligner avec un trait double 55 Annuler le surlignement
53 Surligner avec un trait simple
Couleur du texte Couleur du fond
Code Effet Code Effet
30 Texte noir 40 Fond noir
31 Texte rouge 41 Fond rouge
32 Texte vert 42 Fond vert
33 Texte jaune 43 Fond jaune
34 Texte bleu 44 Fond bleu
35 Texte violet 45 Fond violet
36 Texte cyan 46 Fond cyan
37 Texte gris clair 47 Fond gris clair
39 Texte par défaut 49 Fond par défaut
90 Texte gris foncé 100 Fond gris foncé
91 Texte rouge clair 101 Fond rouge clair
92 Texte vert clair 102 Fond vert clair
93 Texte jaune clair 103 Fond jaune clair
94 Texte bleu clair 104 Fond bleu clair
95 Texte violet clair 105 Fond violet clair
96 Texte cyan clair 106 Fond cyan clair
97 Texte blanc 107 Fond blanc

Pour plus d'informations, voir les pages suivantes :

Voici un script qui permet d'afficher l'ensemble des combinaisons décrites plus haut à l'exception des suppressions d'attributs :

bash-color.sh
#!/usr/bin/env bash
# Show all the colors of the rainbow, should be run under bash
for STYLE in $(seq 0 9; echo 21 53); do
  for FG in $(seq 30 39; seq 90 97); do
    for BG in $(seq 40 49; seq 100 107); do
      CTRL="${STYLE};${FG};${BG}"
      echo -en "\e[${CTRL}m${CTRL}\e[m "
    done
    echo
  done
  echo
done
# Reset
echo -e "\e[m"

Liens externes

informatique/bash.txt · Dernière modification : 2022/08/14 18:48 de alexis