Vous êtes sur la page 1sur 10

Programmation Bash

Révision 3

Objectifs
Présenter Bash;
Présenter les bases de la programmation du shell;
Savoir programmer des expressions logiques et arithmétique ainsi que des boucles;
Savoir recevoir des données de l'utilisateur

Points-importants
Automatiser les taches administratives avec des scripts bash est indispensable et très
efficace (apprendre Python est encore mieux :) :) :))
Insister sur le fait que l'utilisation de Linux est indissociable des scripts

1.1L'environnement 'bash'

Les variables en bash

Pour affecter un contenu à une variable, on utilise la commande suivante

MA_VARIABLE='Ne pas oublier le chat'

Attention à ne pas mettre d'espace avant et après le signe '=' !!!

Pour faire référence au contenu d'une variable, on la préfixe par le signe '$'

echo $MA_VARIABLE
Ne pas oublier le chat

Pour effacer le contenu d'une variable, on utilise la commande unset

unset MA_VARIABLE

Lors de l'utilisation d'une commande 'bash', le shel utilisera la variable PATH pour
retrouver la commande désirée. Vous pouvez afficher le contenu de cette variable par la
commande

echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/games:/usr/X11R

Page 1/10
6/bin:/usr/home/nicolas:/:/usr/bsd:/usr/sbin:/usr/local/bin:/usr
/bin/X11

Par ailleurs le 'shell' utilise des variables pour tenir compte des paramètres de
configuration spécifiques des utilisateurs.
Les variables HOME, DISPLAY, PWD, PWD etc ... en font partie.

echo $HOME
/usr/home/nicolas

Lors du démarrage d'un session 'shell', la plupart des variables sont affectées à partir des
différents fichiers de configuration.

Les fichiers de configuration

Il y a plusieurs types de fichiers de configuration, ceux qui sont lus au moment de la


connexion (login) et ceux qui sont lus à chaque lancement d'un 'shell'

Les fichiers qui seront lus au moment de la connexion au système sont les suivants :
• /etc/profile commun à tous les utilisateurs (s'il existe)
• ~/.bash_profile ou éventuellement ~/.bash_login ou ~/.profile/
Ils servent généralement à décrire l''environnement de l'utilisateur

Les fichiers qui sont lus à chaque lancement de shell sont les suivants :
• ~/.bashrc spécifique à chaque utilisateurs
• /etc/bashrc commun à tous les utilisateurs (s'il existe)

La famille bashrc

Ces fichiers (c.f. ci-dessus) sont lus à chaque fois qu'un shell est lancé (e.g. commande
xterm ou commande bash)
Ils servent généralement à stocker les alias et les fonctions utilisés communément.

On peut démarrer le shell bash avec différentes options lui indiquant quels fichiers de
configuration il doit lire au démarrage.
bash -login : force la lecture des fichiers de login famille 'profile'
bash -norc : pas de lecture des fichiers 'bashrc'
bash -noprofile : : pas de lecture des fichiers 'profile'

Attention, toutes les nouvelles sessions de bash vont hériter des variables définies lors du
login (puisqu'il s'agit d' processus fils) qui sont définies dans les fichiers 'profile'

Page 2/10
1.2Les scripts

Shell script

Un shell script est une liste d'instructions contenues dans un fichier.

#!/bin/bash
# Un petit script mon_script
echo 'Ne pas oublier le chat'

Pour pouvoir exécuter ces instructions, deux conditions doivent être remplies :
• la première ligne doit contenir #!/bin/bash (pour un shell script utilisant bash)
• le fichier doit être exécutable (e.g. en utilisant la commande chmod +x) et lisible (e.g.
avec les permissions 755)

chmod +x mon_script
./mon_script

Si ces conditions ne sont pas remplies, il est toujours possible de 'forcer' l'exécution du
script avec la commande suivante

bash mon_script

Passage de paramètres à un script

Les variables passées au script sur la ligne de commande sont accessibles dans le script
par les variables réservées $1 pour le premier argument, $2 pour le deuxième et ainsi de
suite.
A noter qu'il existe un opérateur shift qui décale ces paramètres.
$2 devient $1, $3 devient $2 et ainsi de suite ... Cela permet essentiellement d'utiliser plus
de 9 paramètres en entrée.

D'autres variables réservées sont accessibles dans le script :


• $0 : le nom du script
• $* : la liste des paramètres
• $# : le nombre de paramètres
• $$ : le numéro du processus en cours d'exécution
• $? : la valeur de retour de la dernière commande.

#!/bin/bash
# un autre script
echo ''mon script est $0''
echo ''il y a eu $$ parmètres en entrée''
echo ''le premier paramètre est $1''

Page 3/10
1.3 Les expressions logiques

Les expressions logiques sont évaluées à l'aide de la fonction test (qui peut s'écrire
également [ ] ).
Le résultat est stocké dans la variable $?
• 0 si le résultat est vrai
• valeur différente de 0 si le résultat est faux

Vérifier si le fichier /bin/bash existe


test -f /bin/bash
ou
[ -f /bin/bash ]

Vérifier si le fichier ~/bin/mon_script est exécutable


test -x ~/bin/mon_script
ou
[ -x /bin/mon_script ]

Les expressions logiques peuvent être combinées par des opérateurs logiques &&
(AND/ET) et || (OU/OR). Il est possible également d'utiliser les connecteurs -a (ET/AND)
et -o (OU/OR)

Vérifier si les fichiers /etc/profile et /etc/bashrc existent

test -f /etc/profile -a test -f /etc/bashrc


ou
test -f /etc/profile && test -f /etc/bashrc
ou
[ -f /etc/profile -a -f /etc/bashrc ]

Quelques options de la commande test :


-f vérifie que le fichier existe et que c'est un fichier standard
-d vérifie que le fichier existe et que c'est un répertoire
-b vérifie que le fichier existe et que c'est un fichier de type bloc
-e vérifie que le fichier existe indépendamment de son type
-r vérifie que le fichier est lisible
-w vérifie que le fichier est inscriptible
-x vérifie que le fichier est exécutable

D'autres options seront données pour le traitement spécifique des nombres

Page 4/10
1.4 Les boucles

Test if

Cette boucle sert pour les tests et 'branchement'

Syntaxe : (la partie else ... est optionnelle)

if <condition>
then
<commande1>
<commande2>
...
else
<commande1>
<commande2>
...
fi

Test de l'existence du fichier 'monfichier.txt'

#!/bin/sh
if test -f monfichier.txt
then
echo " le fichier existe "
fi

Test case

Cet test permet de tester plusieurs valeurs pour une variable

Syntaxe

case <variable> in
valeur1) commande1 ;;
valeur2) commande2 ;;
valeur3) commande3 ;;
...
esac

Test de la valeur du premier paramètre

#!/bin/sh
case $1 in
1) echo " un ";;
2) echo " deux ";;
3) echo " trois ";;
esac

Page 5/10
Boucles for

Cette boucle sert pour répéter les traitements un nombre de fois connu.

Syntaxe

for <variable> in <liste>


do
commande1
commande2
commande3
...
done

Affichage des jours de la semaine

for jour in lundi mardi mercredi jeudi vendredi samedi dimanche


do
echo $jour
done

Boucles while

Cette boucle sert pour répéter les traitements un nombre de fois inconnu. Le test de
continuité se fait au début de la boucle (la boucle continue tant que la condition est vraie)

Syntaxe

while <condition>
do
<commande1>
<commande2>
...
done

Test de lecture d'une valeur jusqu'à ce que l'on entre la valeur '1'

#!/bin/sh
i=0
while [ $i -ne "1" ]
do
read i
done

Il existe une autre boucle, qui utilise le mot clef until à la place de while qui diffère dans le
traitement de la condition : la boucle est exécutée jusqu'à ce que la condition soit vraie

Page 6/10
(i.e. le test est effectué en fin de boucle).

1.5 Les paramètres d'entrée d'un script

La lecture d'une valeur peut se faire par le passage de paramètres sur la ligne de
commande (c.f. précédemment l'utilisation des variables $1, $2 etc ...) ou en lisant une
entrée depuis le script avec la commande read

Lecture du nom d'une personne dans la variable 'nom' et affichage de son

#!/bin/sh
echo 'Entrez votre nom'
read nom
echo '''Vous vous appelez $nom ''

On peut traiter une réponse avec la commande 'case' vue précédemment

#!/bin/sh
echo ''entrez votre choix''
read choix
case $choix in
1) echo " menu un ";;
2) echo " menu deux ";;
3)echo " menu trois ";
esac

On peut également entrer une valeur avec la commande 'select' qui permet de présenter
un menu suivant une valeur de choix

select <variable> in <liste de choix>


do
commande1
commande2
...

done

A noter que :
• la commande select affiche une liste de choix numérotés, le numéro répondu se trouve
dans la variable prédéfinie REPLY et le choix de la liste sera contenu dans la variable
<variable>
• l'invite qui s'affiche est comprise dans la variable prédéfinie PS3
• on peut sortir de la boucle avec la commande break

Page 7/10
#/bin/bash
PS3="Entrez le numéro de votre commande -> "
echo "Que désirez-vous boire ?"
select biere in "Rien, merci" "Skoll" "THB" "Dodo"
do
echo "Vous avez fait le choix numéro $REPLY..."
if [ "$REPLY" -eq 1 ]
then
echo "Au revoir!"
break
else
echo "Votre $biere est servie."
fi
echo
done

1.6 Calculs

Il est possible de comparer des nombres avec la commande test vue précédemment en
utilisant les options suivantes :
-lt <
-gt >
-le <=
-ge >=
-eq =
-ne !=

Test du nombre de paramètres d'entrée

#!/bin/bash
if [ $# -eq 0 ]
then
echo " Vous n'avez entré aucun paramètre"
fi

On peut effectuer des calculs de base avec la commande expr qui utilise les opérateurs
+, -,/ et \* pour la multiplication.
L'expression 'expr 1 + 2' renvoie 3

Affichage d'une table de multiplication

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9
do

Page 8/10
expr $i \* $1
done

Compter jusqu'à 100

#!/bin/bash
i=0
while [ $i -ne 100 ]
do
i=`expr $i + 1`
echo $i
done

On peut également écrire expr <expression> sous la forme $(( <expression> ))

#!/bin/bash
i=0
while [ $i -ne 100 ]
do
#i=`expr $i + 1`
i=$(($i+1))
echo $i
done

1.7 Exercices

Mots-clef
Bash
PATH
/etc/profile
/etc/bashrc
.profile
.bashrc
/bin/bash
$*
$#
$0,1,2
$!
$$
$?
/usr/bin/test

Page 9/10
/usr/bin/expr

Page 10/10