Bash

Un article de Haypo.

Retour à la page précédente Retour aux logiciels libres

Bash est un shell qui fait parti du projet GNU. Je vais présenter ici son langage de programme et diverses astuces.

Sommaire

[modifier] Ligne de commande

[modifier] Raccourcis claviers

  • CTRL-A et CTRL-E pour aller au début/à la fin d'une ligne
  • CTRL-U efface la ligne courante (pratique quand on s'est trompé lors de la saisie d'un mot de passe)
  • CTRL-K coupe le texte courant depuis le curseur jusque la fin de la ligne
  • CTRL-Y colle ce qui a été coupé par CTRL-K
  • Haut/Bas pour se promener dans l'historique
  • TAB tente de compléter la commande en cours
  • TAB TAB donne toutes les complétions possibles s'il y en a plusieurs possibles
  • etc.

[modifier] Assigner temporairement une variable

Changer une variable d'environnement avant de lancer un programme :

 COLUMNS=100 dpkg -l

Lance la commande « dpkg -l » en assignant temporairement la valeur 100 à la variable COLUMNS.

[modifier] Les pipes

Ceci n'est pas une pipe
Ceci n'est pas une pipe

Les « pipes » (mot anglais à prononcer comme paï-peu) permettent de chaîner plusieurs commandes à la suite. L'entrée d'une commande est la sortie de ça précédente.

Compter le nombre de ligne de toutes les fichiers .c d'un répertoire

ls *.c | wc -l

[modifier] Utiliser des parenthèses

Les parenthèses permettent de créer un environnement temporaire dans lequel on peut, par exemple, changer de répertoire le temps de lancer une commande.

 (cd /etc; ls) | wc -l

Compte le nombre de fichiers/répertoires du répertoire /etc (bien sûr, il y a des façons plus simple de faire ça ;-)).

[modifier] Les opérateurs « ; », « && » et « || »

Il y a plusieurs manières d'exécuter plusieurs instructions à la suite :

 commande1; commande2; commande3

Ici les commandes sont exécutées à la suite, sans tenir compte des erreurs.

 commande1 && commande2 && commande3

Ici, si une commande échoue, les autres commandes ne seront pas exécutées (et logique).

 commande1 || commande2

La commande2 sera exécutée uniquement si la commande1 échoue (ou logique).

[modifier] Commandes internes de Bash

  • exit ou exit  : quitte un script
  • for i in <liste>; do <commandes>; done : boucle
  • case : choix multiple
  • select : choix multiple demandant de saisir une chaîne de caractère (permet de faire un genre de menu)
  • while <cond>; do <commandes>; done
  • ou while <cond>; do <commandes>; done : boucle "tant que"
  • if <condition> then <commandes>; fi
  • ou if <condition> then <commandes>; else <commandes> fi
  • ou if <condition> then <commandes>; elif <condition> then <commandes> else <commandes> fi : test logique

[modifier] Langage Bash

[modifier] Boucle

Affiche 1 2 3 (un par ligne) :

for i in 1 2 3; do echo $i; done

Affiche la liste des fichiers en remplaçant l'extension .JPG par .jpg :

for i in $(ls); do
  echo $i | sed -e 's/\.JPG$/\.jpg/';
done

[modifier] Test (if)

Teste si pouet est un fichier (existe et est de type "fichier") :

 if [ -e pouet ]; then
   echo "On le tient"
 else
   echo "Il est où ?"
 fi

L'instruction vérifie juste le code de retour d'une commande, on peut truc utiliser par exemple :

 if ls; then
   echo "La commande ls s'est correctement déroulée"
 else
   echo "Échec de la commande ls !"
 fi

On peut aussi utiliser ce genre de syntaxe :

 test -e pouet && echo "On le tient"

et

 test -e pouet || echo "Il est où ?"

Par contre, chaîner "&&" et "||" prête à confusion :

 test -e pouet && commande1 || commande2

Lancera la commande2 si la commande1 échoue, ce qui n'est pas voulu. Après, on peut s'amuser à mettre ça entre parenthèse et jouer avec les commandes false et true :

 (test -e pouet && (commande1 && commande2 && commande3; true)) || (commande4 && commande5)

Mais bon, autant utiliser l'instruction if :-D

[modifier] Tests successifs (switch/case)

Syntaxe :

case "$1" in
   "start" | "restart") ... ;;
   stop) ... ;;
   *) ... ;;
esac

« *) » représente le choix par défaut si aucun autre test n'est validé.

[modifier] Fonction

On peut définir nos propres fonctions dans un script Bash, qui sera ensuite utilisée comme une commande classique.

 function cherche
 {
   find ./ -name "$1"
 }
 cherche "*.jpg"

Les paramètres d'une fonction se récupèrent en utilisant la variable "$i" ($1, $2, ...).

[modifier] Lancer un script Bash

Pour lancer un script, il existe divers manières. On peut donner le droits d'exécution au script, puis le lancer directement :

 chmod +x script.sh
 ./script.sh

Sinon, on peut demande à bash de l'évaluer avec sa commande interne « source ». Ceci à l'avantage d'autoriser à modifier des variables d'environement (PATH par exemple).

 source script.sh

ou en utilisant l'abréviation « . » de la commande interne source :

 . script.sh

[modifier] Attraper un signal via trap

Il est possible d'attraper un signal envoyé à un programme via la commande trap. Exemple de script :

# Handler pour les signaux attrapés, se contente d'afficher un message
function stop_valgrind
{
    echo "NuAuth in Valgrind stopped with CTRL+C"
}    

# Met en place notre handler
trap stop_valgrind SIGINT SIGTERM

valgrind \
   --show-reachable=yes -v --suppressions=valgrind.supp \
   --leak-check=full \
   --log-file-exactly=valgrind.log \
   ./nuauth

# Remet l'ancien handler
trap - SIGINT SIGTERM
...

[modifier] Programmes test et [

Les programmes test et [ (oui oui, c'est bien son nom, faites "which [" pour voir :-)) sont très utile pour faire des tests logiques : comparer des chaînes, comparer des nombres, faire des tests sur des fichiers, etc.

Syntaxe :

  • « TESTA -a TESTB » : (AND) Vrai si deux tests sont vrais
  • « TESTA -o TESTB » : (OR) Vrai si au moins un des tests est vrai
  • « ! TESTA » : (NOT) Inverse le résultat d'un test

Tests sur de chaînes :

  • « STRA = STRB » / « STRA != STRB » : Teste si deux chaînes sont identiques / différentes
  • « -n STR » : La chaîne n'est pas vide (longueur supérieure à zéro)
  • « -z STR » : La chaîne est vide (longueur nulle)

Tests sur des nombres :

  • (X==Y) « X -eq Y » : Teste si X est égal à Y
  • (X!=Y) « X -ne Y » : Teste si X est différent de Y
  • (X>=Y) « X -ge Y » : Teste si X est plus grand ou égal que Y
  • (X>Y) « X -gt Y » : Teste si X est plus grand que Y
  • (X<=Y) « X -le Y » : Teste si X est plus petit ou égal que Y
  • (X<Y) « X -lt Y » : Teste si X est plus petit que Y

Tests sur les fichiers :

  • « -e FICHIER » : Teste si un fichier existe
  • « -d FICHIER » : Teste si un fichier existe et est un répertoire
  • « -h FICHIER » ou « -L FICHIER » : Teste si un fichier existe et est un lien symbolique
  • « -r FICHIER » : Teste si un fichier existe et si l'utilisateur courant a le droit de le lire
  • « -w FICHIER » : Teste si un fichier existe et si l'utilisateur courant a le droit d'y écrire
  • « -s FICHIER » : Teste si un fichier existe et n'est pas vide (taille plus grande que zéro)

Il existe de nombreux autres tests (est du type caractère, a le drapeau set-group-id, etc.). Référez-vous à la documentation.

[modifier] Articles connexes

  • Outils UNIX : Guide de survie des commandes UNIX les plus courantes (find, grep, wc, ...)
Récupérée de « http://www.haypocalc.com/wiki/Bash »