PROGRAMMATION EN SHELL BASH

Introduction

Le shell est l'interpréteur de commandes qui sert d'interface entre le système d'exploitation et son utilisateur. Sous Linux, il existe de nombreux shells, le shell bash étant l'un des plus courants.

Pour savoir quel shell est utilisé sur votre système, il suffit d'afficher la variable d'environnement $SHELL.

echo $SHELL

La liste de tous les interpréteurs de commandes disponibles sur votre système est contenue dans le fichier /etc/shells.

cat /etc/shells

Naturellement, il est possible de changer de shell. On utilise la commande chsh -s [shell] [utilisateur] pour cela. Il est nécessaire de se déconnecter et de se reconnecter pour que le changement soit pris en compte.

Par exemple, pour l'utilisateur paul :

chsh -s /bin/bash paul

Le shell est un interpréteur de commandes, mais aussi un langage de programmation. Les commandes sont placées les unes à la suite des autres dans un fichier exécutable.

Mise en oeuvre

Exemple

Il faut déclarer, en entê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

Sauvegardez votre fichier sous le nom NomDeVotreScript (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 avec la commande :

chmod u+x NomDeVotreScript

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 "./" :

./NomDeVotreScript

Transformer un script en une commande

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".

Le quoting

Tout ce qui est placé entre "" est lu littéralement sauf ` (accent grave) , $ et ".

Tout ce qui est placé entre ' (accent aigu) est lu littéralement, sauf un autre accent aigu.

Pour déspécialiser un caractère utiliser le \ (back slashe).

Essayez par exemple le code suivant :

#!/bin/bash
nom="Pierrot"
echo "Salut Pierrot"
echo "Salut \"Pierrot\""
echo "Salut $nom"
echo "Salut \$nom"

Les structures de contrôle

Structure 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

Structure 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.

Structure 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

let

Cette instruction permet de faire des calculs

i=2
let i=i+1
let "i = i + 1"
echo $i

read

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

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

select

Cette instruction 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

Répéter jusqu'à

until
	Commande_Test
do
	Commandes
Done

Tant que

while
	Commande_Test
do
	Commandes
Done

Autres commandes

Désactiver le retour à la ligne

echo -n désactive le retour de chariot de fin de chaîne

Exemple :

echo -n "Un nombre"

Arguments passés à la fonction

Quand on lance un script :

Exemple :

echo "Nombre d'argument "$#
echo "Les arguments sont "$*
echo "Le second argument est "$2

La commande test

Elle permet de faire un test et de renvoyer 0 si tout s'est bien passé ou 1 en cas d'erreur. La commande man test permet de connaître tous les opérateurs. On peut raccourcir la commande test par des crochets.

test expression ou alors [ 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 :

Tests sur les entiers :