PROGRAMMATION EN BASH

Introduction

Le shell Bash est un interpréteur de commandes, mais aussi un langage de programmation. Les commandes placées les unes à la suite des autres dans un fichier exécutable forment ce que l'on nomme un script.

Mise en œuvre

Exemple

Il faut déclarer, en en-tête du script, le nom et l'emplacement de l'interpréteur de commandes :

#!/bin/bash

Exemple de script :

#!/bin/bash
echo "Entrez votre nom"
read nom
echo "Bonjour"
echo $nom

Le fichier est sauvegardé sous le nom NomDuScript (par exemple). Attention à l'encodage des caractères (utf8). Bien que ce ne soit pas une obligation, le nom du script est souvent suivi de l'extension .sh.

Le script est rendu exécutable par l'utilisateur avec la commande :

chmod u+x NomDuScript

Plus simplement, il est rendu exécutable pour tout le monde avec la commande :

chmod +x NomDuScript

Pour exécuter le script, il faut se placer dans le dossier où se trouve le script et préfixer la commande par les caractères "./" :

./NomDuScript

Faire d'un script une commande externe

La variable d'environnement $PATH définit la liste des dossiers contenant les fichiers exécutables depuis la ligne de commande. Pour transformer un script en une commande, une solution consiste à le placer dans un de ces dossiers. Ils peuvent être affichés avec la commande ci-dessous.

echo $PATH

On peut aussi modifier la variable d'environnement $PATH. Pour la session en cours :

export PATH=$PATH:/home/utilisateur/mes_prog

Pour une modification persistante au niveau session utilisateur, on peut ajouter la commande ci-dessus à la fin du fichier .bashrc, situé dans le dossier personnel.

Pour une modification persistante au niveau système, il faut modifier le fichier "/etc/environment".

Les substitutions

Substitution de variable

Le caractère $ est suivi de la variable entre accolades. Souvent, la variable est suivie du caractère espace. Les accolades sont alors superflues.

#!/bin/bash
debut=éco
echo "L'$debut est un préfixe."
echo "L'${debut}logie est un mot utilisant le préfixe."

Une variable non définie n'engendre pas d'erreur. Elle contient une chaîne vide sauf si une valeur par défaut est définie.

#!/bin/bash
i="Variable connue"
echo Variable connue : ${i} 
echo Variable non définie : ${j} 
echo Valeur de variable par défaut : ${k:-"Valeur par défaut"} 

Substitution de commande

Le caractère $ est suivi de la commande entre parenthèses.

#!/bin/bash
echo $(pwd)

Substitution arithmétique

Le caractère $ est suivi du calcul entre double parenthèses.

#!/bin/bash
a=5
echo $((2*a-3))

Les chaînes de caractères

Généralités

La commande echo permet d'afficher une chaîne de caractères. Les deux commandes suivantes donnent le même résultat. Dans le premier cas, la commande echo prend deux paramètres. Dans le deuxième cas, elle n'en prend qu'un seul.

#!/bin/bash
echo Bonjour Jean
echo "Bonjour Jean"

Une chaîne de caractères comportant un caractère espace se place habituellement entre guillemets.

#!/bin/bash
nom1=Marie
nom2="Petit Jean"
echo Bonjour $nom1
echo Bonjour $nom2

Certains caractères ont une signification pour le shell. Par exemple, > sert à la redirection et $ à la substitution. Pour protéger ces caractères de l'interprétation du shell, trois mécanismes existent.

Protection à l'aide de la barre inversée

Exemple :

#!/bin/bash
nom1=Marie
nom2="Petit Jean"
echo Bonjour $nom1
echo Bonjour \$nom1
echo "Bonjour $nom2"
echo "Bonjour \$nom2"
echo "Bonjour \"Pierre\""

Protection partielle entre guillemets

Entre guillemets, tous les caractères de chaîne sauf $ \ `(accent grave) " sont protégés de l'interprétation du shell.

Protection totale entre apostrophes

Entre apostrophes, aucun caractère de chaîne, sauf le caractère ', n'est interprété.

Les structures de contrôle

La commande test

Syntaxe

La commande test permet de faire un test et de renvoyer 0 si tout s'est bien passé ou 1 en cas d'erreur. La variable $? contient la valeur de retour. On peut raccourcir la commande test par des crochets. Les deux écritures ci-dessous sont donc équivalentes.

test expression
[ expression ]

Exemple :

test -f /etc/passwd
echo $?

Ecrit d'une autre manière :

[ -f /etc/passwd ]
echo $?

Tests sur les fichiers

Tests sur les chaînes de caractères

Tests sur les entiers

Opérateurs logiques

Structures conditionnelles

if, then, else, fi

if expression
	then
		instruction1
		instruction2...
	else
		instruction3
fi

Exemple :

if [ -f $1 ]
	then
		echo "C'est un fichier."
	else
		echo "Je ne sais pas ce que c'est."
fi

case

case chaîne in
	commandes
	...
	;;
esac

Exemple :

echo -n "Entrez un nombre :"
read nombre
case $nombre in
	1) echo "Vous avez tapé 1";;
	2) echo "Vous avez tapé 2";;
	*) echo "Vous n'avez tapé ni 1 ni 2";;
esac

select

Cette commande facilite la création de menus.

select nom [ in liste ; ]
do
	commandes
done

Exemple : Ici, le numéro du choix est affecté à $REPLY, le nom du choix à $nom.

select choix in \
	"Choix A" \
	"Choix B";
do
	case $REPLY in
		1) echo "$choix --> $REPLY";;
		2) echo "$choix --> $REPLY";;
		*) echo "Vous avez tapé n'importe quoi !";;
	esac
done

Structures répétitives

for

for x [ in list ] ; do
	commandes
done

Exemple :

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

Autre exemple :

for var in * ; do
	echo "$var"
done

* représente la liste des fichiers contenus dans le dossier courant.

until

until
	Commande_Test
do
	Commandes
Done

while

while
	Commande_Test
do
	Commandes
Done

Autres commandes

Commentaires

On écrit un commentaire dans un fichier script en utilisant le symbole #. Exemple :

#!/bin/bash
# Un message d'accueil...
echo "Bonjour tout le monde!"

Paramètres du script

Quand on lance un script :

Exemple :

echo "Nombre de paramètres "$#
echo "Les paramètres sont "$*
echo "Le second paramètre est "$2

Commande read

Cette commande permet la lecture d'une valeur au clavier.

echo -n "Entrez votre nom :"
read nom
echo $nom

Désactivation du retour à la ligne

Le retour de chariot de fin de chaîne peut être désactivé de plusieurs manières :

echo -n "Un texte"
printf "Un texte"

Faire des calculs

Différentes solutions existent pour effectuer des calculs sur des entiers : La substitution arithmétique, les commandes expr ou let. On utilise la commande bc (calculatrice basique) pour faire des calculs avec des nombres à virgule. Elle fonctionne normalement en mode interactif. Pour le mode commande, on ajoute un tube (ou pipe).

echo "scale=2; 13.7/1.2" | bc