Bash
Un article de Haypo.
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
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, ...)

