Programmation Bash/Notions essentielles du shell bash

Un livre de Wikilivres.

Commandes shell[modifier | modifier le wikicode]

Définition

Une commande shell est une chaîne de caractères en minuscules qui peut être invoquée au travers d'une invite de commande ou d'un script. Des options et des arguments peuvent la compléter. Ceux-ci sont généralement appelés paramètres de la commande.

Exemples de commande bash :

ls
ls -l /tmp
cd /tmp
cp liste.pdf /pub/pdf
cp -r repertoire/ /pub/


Syntaxe[modifier | modifier le wikicode]

La syntaxe générique d'une commande shell est :

commande [options [argument1 [argument2 [... ]]]]

où une chaîne de caractères entre crochets est optionnelle.

Le nombre d'argument peut être limité (se reporter au manuel de la commande).

Les options de la commande peuvent être :

  • des options courtes formées par un tiret suivi d'une lettre. Exemple : -s
  • des options longues formées par deux tirets suivis d'un mot. Exemple : --size
  • des options courtes ou longues qui exigent un argument. Exemples : --speed 50 ou -s 50


Informations sur les commandes[modifier | modifier le wikicode]

La commande whereis permet de rechercher les fichiers exécutables, les sources et les pages de manuel d'une commande Par exemple :

$ whereis python
python: /usr/bin/python2.3 /usr/bin/python /etc/python2.3 /usr/lib/python2.3 /usr/lib/python2.4
/usr/local/lib/python2.3 /usr/include/python2.3 /usr/share/man/man1/python.1.gz

signifie qu'il existe sur le système plusieurs commandes python dans différents répertoire. La page du manuel se trouve dans /usr/share/man/man1/.

La commande which permet de savoir quel est le fichier exécuté lorsque l'on entre le nom d'une commande. Par exemple :

$ which python
/usr/bin/python

signifie que le code de la commande python utilisée par le système d'exploitation se trouve dans le répertoire /usr/bin/.

Enfin, whatis permet de savoir rapidement à quoi sert une commande. Exemple :

$ whatis python
python (1)           - an interpreted, interactive, object-oriented programming language

Manuel[modifier | modifier le wikicode]

Pour obtenir des informations plus complètes sur l'usage et l'utilité d'une commande, il suffit d'invoquer le manuel en ligne de commande : man nom_de_la_commande. Pour sortir du manuel, composer la combinaison de touche esc : q.

$ man echo
Remise en forme de echo(1), attendez SVP...
ECHO(1)                                     Manuel de l'utilisateur Linux                                     ECHO(1)

NOM
       echo - Afficher une ligne de texte.

SYNOPSIS
       echo [-neE] [message ...]
       echo {--help,--version}

DESCRIPTION
       Cette page de manuel documente la version GNU de echo.

       La plupart des shells ont une commande interne ayant le même nom et les mêmes fonctionnalités.

       echo  écrit  chaque  message  sur  la sortie standard, avec une espace entre chacun d'eux,
 et un saut de ligne après le dernier.

   OPTIONS
       -n     Ne pas effectuer le saut de ligne final.

       -e     Interprète les séquences de caractères précédées d'un backslash '\' suivantes :
              \a     alerte (sonnerie)
              \b     retour en arrière d'un caractère
              \c     supprimer le saut de ligne final
              \f     saut de page
              \n     saut de ligne
              \r     retour chariot
              \t     tabulation horizontale
              \v     tabulation verticale
              \\     backslash
              \nnn   le caractère de code ASCII nnn (en octal)

       -E     Désactiver les interprétations des séquences spéciales.

   OPTIONS GNU
       Quand la version GNU de echo est appelée avec exactement un argument, les options suivantes sont reconnues :

       --help Afficher un message d'aide sur la sortie standard et se terminer normalement.

       --version
              Afficher un numéro de version sur la sortie standard et se terminer normalement.

TRADUCTION
       Christophe Blaess, 1996-2003.
Exemple  : consultation du manuel pour la commande echo


En particulier, la page manuel de bash fourni une documentation quasi-complète. Elle est correctement traduite en français.

   $ man bash

Enchaînements de commandes[modifier | modifier le wikicode]

Enchaînements simples[modifier | modifier le wikicode]

Exécutions simultanées[modifier | modifier le wikicode]

com1 & com2 & com3 & ... & comN

Les commandes com1 jusqu'à comN sont exécutées parallèlement.

Exécutions successives[modifier | modifier le wikicode]

com1 ; com2 ; ... ; comN

Les commandes com1 jusqu'à comN sont exécutées successivement, les unes après les autres.

Enchaînements conditionnels[modifier | modifier le wikicode]

Et... et ... et[modifier | modifier le wikicode]

com1 && com2 && ... && comN

Dans ce cas, la commande comP ne s'exécute que si com(P-1) s'est soldée par un succès. Exemple :

$ echo toto && echo jojo && echo sidonie
toto
jojo
sidonie
$  [ 1 -gt 2 ] && echo jojo
$ 

Dans le premier cas echo toto && echo jojo && echo sidonie, toutes les propositions sont justes, donc elles sont toutes exécutées. Dans le second [ 1 -gt 2 ] && echo jojo, la première partie [ 1 -gt 2 ] teste si 1 est plus grand que 2. Comme cette assertion est fausse, la deuxième partie n'est pas exécutée.

Cette structure est souvent utilisée pour programmer plus rapidement une structure conditionnelle de type if. Par exemple, les deux séries de commandes suivantes produisent le même résultat :

[ $note -gt 10 ] && echo "tu as la moyenne"
if [ $note -gt 10 ]
then
echo "tu as la moyenne"
fi

Alternative[modifier | modifier le wikicode]

com1 || com2 || ... || comN

Dans cet exemple les commandes com1 jusqu'à comN sont exécutées successivement tant qu'aucune ne se termine correctement. Dès qu'une des commandes se solde par un succès, la commande alternative est terminée.

Exemple :

$ echo toto || echo jojo || echo sidonie
toto
$ [ 1 -gt 2 ] || echo jojo
jojo


Variables[modifier | modifier le wikicode]

Affectation[modifier | modifier le wikicode]

Pour affecter une valeur à une variable, la syntaxe est la suivante :

variable=valeur

place la valeur dans la variable. La portée de cette variable est locale au processus shell qui l'a définie.

Il faut faire très attention à ne pas placer d'espaces ni avant ni après le signe égal lors d'une affectation en bash. Ainsi, l'expression variable =valeur engendrera l'erreur variable: not found et variable= valeur donnera l'erreur valeur: not found.

Bash utilise le mécanisme de typage dynamique : il n'est donc pas nécessaire de spécifier un type pour une nouvelle variable.

Un nom de variable peut contenir des chiffres, des lettres et des symboles souligné mais ne doit pas commencer par un chiffre. La plupart du temps, les variables du shell bash sont des chaînes de caractères.

Substitution[modifier | modifier le wikicode]

On peut vérifier le contenu d'une variable à l'aide de la commande echo :

$ variable=5
$ echo $variable
5

Ce mécanisme qui différencie la variable de son contenu est nommé substitution. On peut en faire l'expérience grâce aux commandes suivantes :

$ variable=5
$ echo variable
variable
$ echo $variable
5

Par convention, le symbole $ représente l'invite de commande.

Concaténation[modifier | modifier le wikicode]

prefix="préfixe"
suffix="suffixe"
echo "${prefix}_milieu_${suffix}"
préfixe_milieu_suffixe

Variables réservées[modifier | modifier le wikicode]

Certaines variables ont une signification spéciale réservée[1]. Elles sont utilisées lors de la création de scripts :

  • pour récupérer les paramètres transmis sur la ligne de commande,
  • pour savoir si une commande a échoué ou réussi,
  • pour automatiser le traitement de tous paramètres.

Voici la liste de ces variables :

  • $0 : nom du script. Plus précisément, il s'agit du paramètre 0 de la ligne de commande, équivalent de argv[0]
  • $1, $2, ..., $9 : respectivement premier, deuxième, ..., neuvième paramètre de la ligne de commande
  • $* : tous les paramètres vus comme un seul mot
  • $@ : tous les paramètres vus comme des mots séparés : "$@" équivaut à "$1" "$2" ...
  • $# : nombre de paramètres sur la ligne de commande
  • $- : options du shell
  • $? : code de retour de la dernière commande. Vaut généralement 0 si cette commande s'est bien déroulée, et un autre nombre correspondant à un type d'erreur, décrit par la commandeerrno[2].
  • $$ : PID du shell
  • $! : PID du dernier processus lancé en arrière-plan
  • $_ : dernier argument de la commande précédente

Variables d'environnement[modifier | modifier le wikicode]

Une variable d'environnement est une variable accessible par tous les processus fils du shell courant. Pour créer une variable d'environnement, on exporte la valeur d'une variable avec la commande export.

export variable

Pour illustrer la différence entre une variable locale et une variable d'environnement, il suffit de créer une variable d'environnement, de lancer un shell fils et d'afficher la variable.

$ ma_variable=toto
$ export ma_variable
$ bash
$ echo $ma_variable
toto
$ exit

Dans ce cas, la valeur de la variable est accessible depuis le shell fils. Si on essaye de faire la même chose sans exporter la variable, la valeur ne sera pas accessible.

$ ma_variable=toto
$ bash
$ echo $ma_variable

$ exit

La commande env permet de récupérer la liste des variables d'environnement du système d'exploitation. D'une manière générale, les variables d'environnement sont notées en majuscules.

$ env
REMOTEHOST=pcloin
HOST=machine.univ-autonome.fr
TERM=xterm-color
SHELL=/bin/bash
SSH_CLIENT=::ffff:197.123.57.3 55747 22
SSH_TTY=/dev/pts/0
http_proxy=http://proxy.univ-autonome.fr:3128/
GROUP=shadogroup
USER=shadouser
temp=2.6.20.1
HOSTTYPE=i386-linux
MAIL=/var/mail/shadouser
PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/game
PWD=/home/shadouser
EDITOR=/bin/vi
LANG=fr_FR@euro
temp1=Linux
PS1=\[\033[0;31m\]-->\T<--\[\033[0;34m\][\u@\h]\w[$]\[\033[0;32m\] --> \[\033[0;34m\] 
PS2=> 
SHLVL=2
HOME=/home/shadouser
OSTYPE=linux
VENDOR=intel
MACHTYPE=i386
LOGNAME=patin
SSH_CONNECTION=::ffff:197.123.57.3 55747 ::ffff:199.1.1.62 22
_=/usr/bin/env
Utilisation de la commande env  : consultation des variables d'environnement sur station Linux


Quotes, apostrophe, guillemets et apostrophe inversée[modifier | modifier le wikicode]

Simple quote ou apostrophe[modifier | modifier le wikicode]

Les simples quotes délimitent une chaîne de caractères. Même si cette chaîne contient des commandes ou des variables shell, celles-ci ne seront pas interprétées. Par exemple :

$ variable="secret"
$ echo 'Mon mot de passe est $variable.'
Mon mot de passe est $variable.

Doubles quotes ou guillemets[modifier | modifier le wikicode]

Les doubles quotes délimitent une chaîne de caractères, mais les noms de variable sont interprétés par le shell. Par exemple :

$ variable="secret"
$ echo "Mon mot de passe est $variable."
Mon mot de passe est secret.

Ceci est utile pour générer des messages dynamiques au sein d'un script.

Back-quote, apostrophe inversée ou accent grave[modifier | modifier le wikicode]

Bash considère que les Back-quotes délimitent une commande à exécuter. Les noms de variable et les commandes sont donc interprétés. Par exemple :

$ echo  `variable="connu"; echo "Mon mot de passe est $variable."` 
Mon mot de passe est connu.

Autre exemple :

echo `ls` 

Cette commande affiche le contenu du répertoire courant à l'écran. Elle est strictement équivalente à ls.

Le caractère apostrophe inversée est obtenu sur les clavier PC français par la combinaison Alt Gr + 7 et se trouve à gauche de la touche retour sur les clavier Macintosh.

  1. https://www.quennec.fr/book/export/html/269
  2. https://www.cyberciti.biz/faq/linux-bash-exit-status-set-exit-statusin-bash/