Programmation Bash/Notions essentielles du shell bash
Commandes shell
modifier
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
modifierLa 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
modifierLa 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
modifierPour 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
modifierEnchaînements simples
modifierExécutions simultanées
modifiercom1 & com2 & com3 & ... & comN
Les commandes com1
jusqu'à comN
sont exécutées parallèlement.
Exécutions successives
modifiercom1 ; com2 ; ... ; comN
Les commandes com1
jusqu'à comN
sont exécutées successivement, les unes après les autres.
Enchaînements conditionnels
modifierEt... et ... et
modifiercom1 && 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
modifiercom1 || 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
modifierAffectation
modifierPour 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
modifierOn 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
modifierprefix="préfixe"
suffix="suffixe"
echo "${prefix}_milieu_${suffix}"
préfixe_milieu_suffixe
Variables réservées
modifierCertaines 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 deargv[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
modifierUne 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
modifierSimple quote ou apostrophe
modifierLes 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
modifierLes 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
modifierBash 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.