Les scripts BASH

Le shell

La console est un outil très puissant qui permet d'effectuer des actions habituellement difficiles à réaliser dans un environnement graphique.

Le shell est le programme qui gère l'invite de commandes. C'est donc le programme qui attend que vous rentriez des commandes.

C'est aussi le programme qui est capable par exemple de :

  • se souvenir quelles étaient les dernières commandes tapées (vous remontez dans votre historique en appuyant sur la flèche « Haut »
  • autocompléter une commande ou un nom de fichier lorsque vous appuyez sur Tab
  • gérer les processus
  • rediriger et chaîner les commandes
  • définir des alias

Le .bashrc est le fichier de configuration du bash que Linux vous fait utiliser par défaut. Chaque personne peut avoir son .bashrc pour personnaliser son invite de commandes, ses alias.

Dans le .bashrc vous pouvez par exemple configuré le texte de votre prompt. Des outils en ligne existent pour vous simplifier la création de bashrc (voir http://bashrcgenerator.com/ par exemple).

Faire des scripts

L'avantage du shell est que l'on peut faire des scripts à partir des commandes à notre disposition dans la console.

Comme nous l'avons déjà indiqué à plusieurs reprises, la philosophie Unixienne est une commande fait une et une seule chose mais la fait bien.

C'est à partir de ce principe que vous pouvez développer des scripts puissants en bash.

Un script bash est un simple fichier texte. Pour indiquez quel shell utilisé un script commence par #!/bin/bash (ou bash peut être remplacé par le shell que vous utilisez).

Pour pouvoir executer un script il faut que celui ci soit executable pour l'utilisateur qui désire le lancer. (rappel : chmod +x donne le droit d'execution sur un fichier à tout le monde)

Dans un script bash toutes les commandes à votre disposition dans la console peuvent être utilisée.

Notre premier script listera simplement les fichiers dans un répertoire

Créez un fichier liste.sh avec le conteny suivant :

#!/bin/bash
ls

Il faut rendre le fichier executable en faisant un chmod +x liste.sh.

Pour lancer votre fichier il suffit maintenant de taper : ./liste.sh

Quand vous développez des scripts il est parfois nécessaire de les debugguer, par exemple pour savoir à quelle ligne le script ne fonctionne pas correctement. L'option -x permet d'afficher la ligne executée avant d'afficher le résultat.

Si vous executez votre script avec bash +x liste.sh au lieu de ./liste.sh vous serez en mode debug

Variables

Un script bash est capable de créer ses variables et d'utiliser les variables d'environnement existantes.

La création d'une variable est simple : maVariable = "Je suis une variable"

Pour afficher une variable la commande echo. Pour indiquer au script qu'il s'agit d'une varible, il suffit de la préfixer avec un $.

Par exemple echo $maVariable affichez notre texte.

Si votre programme a par exemple besoin de demander à l'utilisateur de saisir un paramètre la fonction read est là pour vous aider.read monParametre va permettre à l'utilisateur de saisir un valeur. Cette valeur sera stockée dans la variable $monParametre

A FAIRE : Modifier votre script liste pour pouvoir saisir le répertoire ou vous désirez faire le ls.
Par exemple ./liste.sh tmp devra afficher le contenu du répertoire tmp

read dispose de plusieurs paramètre dont par exemple :

  • -p "MESSAGE" : pour afficher un texte MESSAGE avant la saisie
  • -n X : pour limiter le nombre de caractères saisis à X
  • -t X : pour limiter le temps de saisie à X secondes
  • -s : pour ne pas afficher le texte saisi. Par exemple pour demander un mot de passe.

Opérations mathématiques

La commande let permet d'effectuer des opérations mathématiques

let permet

  • l'addition : +
  • la soustraction : -
  • la multiplication : *
  • la division : /
  • la puissance : **
  • le modulo (renvoie le reste de la division entière) : %
let "a = 5"
let "b = 2"
let "c = a + b"
echo $c

Variables d'environnement

Il existe des variables créées par les différentes applications de Linux. En tapant env dans la console vous pourrez voir la liste des variables disponibles à l'utilisateur.

Ces variables s'utilisent comment mes variables que nous avons vu précédemment

A FAIRE : Créer un script retour.sh qui permet de retourner au répertoire ou vous vous trouviez avant l'actuel.

Les paramètres

Les paramètres sont des variables que vous créez à l'appel de la fonction. Votre script gère les paramètre des la façon suivante :

  • $# : contient le nombre de paramètres
  • $0 : contient le nom du script exécuté
  • $1 : contient le premier paramètre
  • $2 : contient le deuxième paramètre
  • $x : contient le xème paramètre

A FAIRE : Modifier votre script liste.sh pour qui liste le contenu du répertoire passé en paramètre.

Les conditions

Comme tout language de programmation bash dispose d'un ensemble d'outils de conditions.

if permet de tester SI quelque chose est vrai ALORS on fait quelque chose, SINON on peut eventuellement faire autre chose

Le code d'un if est :

if [ condition ]
then
    echo "La condition est vraie"
fi

Une condition est par exemple $maVariable = "Bonjour"

Il est à noté qu'il est obligatoire de mettre un espace autour de la condition.

else nous introduit le SINON et se place de la façon suivante :

if [ condition ]
then
    echo "La condition est vraie"
else
    echo "La condition est n'est pas correcte !!!!"
fi

Vous pouvez effectuer différents types de test.

  • des tests sur des chaînes de caractères
  • des tests sur des nombres
  • des tests sur des fichiers

Vous pouvez sur des chaines de caractères :

  • $chaine1 = $chaine2
  • $chaine1 != $chaine2 : les deux chaines sont différetes
  • -z $chaine : la chaine est vide
  • -n $chaine : la chaine est non vide

A FAIRE : modifier votre script liste.sh pour vérifier qu'il y a bien un paramètre. S'il n'y a pas de paramètre, afficher un message d'erreur et quitter (fonction exit)

Vous pouvez sur des nombres :

  • $num1 -eq $num2 : nombres sont égaux ?
  • $num1 -ne $num2 : nombres sont différents ?
  • $num1 -lt $num2 : $num1 inférieur à $num2 ?
  • $num1 -le $num2 : $num1 inférieur ou égal à $num2 ?
  • $num1 -gt $num2 : $num1 supérieur à $num2 ?
  • $num1 -ge $num2 : $num1 supérieur ou égal à $num2 ?

A FAIRE : modifier votre script liste.sh pour vérifier le nombre de paramètres. S'il y a plus de 1 paramètre on affiche un message "Trop de paramètres" et on quitte.

Vous pouvez sur des fichiers :

  • -e $nomfichier : le fichier existe ?
  • -d $nomfichier : c'est un répertoire ?
  • -f $nomfichier : le fichier est un fichier ? (et pas un lien symbolique ou autre chose ...)
  • -L $nomfichier : lien symbolique ?
  • -r $nomfichier : disponible en lecture ?
  • -w $nomfichier : disponible en écriture ?
  • -x $nomfichier : disponible en execution ?
  • $fichier1 -nt $fichier2 : $fichier1 plus récent que $fichier2
  • $fichier1 -ot $fichier2 : $fichier1 plus vieux que $fichier2

Il est fréquent d'avoir à effectuer plusieurs tests. Dans ce cas, vous avez à votre disposition les opérateurs ET (&&) et OU (||).

Par exemple pour tester si le paramètre 1 vaut start ou stop :

if [ $1 = 'start' ] || [ $1 = 'stop' ]
echo "Commande d'arrêt ou de démarrage détectée ..." fi

Vous pouvez également inverser un test en mettant un ! devant la condition :

if [ ! -e "/tmp/test.log" ]

Dans ce cas si le fichier n'existe pas nous sommes dans la condition.

Toutefois, il arrive de se retrouver dans une situation ou de nombreux if se suivent.

Dans ces conditions case nous permet d'améliorer considérablement la lisibilité de notre code

#!/bin/bash

case $1 in
"start")
echo "Démarrage du service"
;;
"stop")
echo "Arrêt du service"
;;
"reload")
echo "Rechargement des fichiers de configuration"
;;
*)
echo "Action par défaut ... "
;;
esac

Les boucles

Bash nous propose des structures pour mettre en place des boucles. while et for vont vous permettre d'itérer sur des tableaux par exemple ou d'executer tant qu'une condition n'est pas remplie.

while [ test ]
do
echo 'Action en boucle'
done

A FAIRE : Faites un script param.sh qui prend en X paramètres. Quand on execute ce script on affiche "Param1 : valeur", "Param2 : valeur, ...."

Les boucles for permettent d'itérer sur un tableau par exemple.

for variable in 'valeur1' 'valeur2' 'valeur3'
do
echo "La variable vaut $variable"
done

Ci dessus, nous allons executer la boucle 3 fois, c'est à dire pour chaque valeur présente dans la liste passée en paramètre du for

Une des utilisations interressantes de for est de récupérer le résultat d'une commande (par exemple un ls) et d'itérer sur chacun des résultats.

#!/bin/bash

liste_fichiers=`ls`

for fichier in $liste_fichiers
do
echo "Fichier trouvé : $fichier"
done

Notez bien que pour créer une variable avec le résultat d'une commande, la commande doit être entourée de ` (ALT GR+7 sous windows, touche à gauche de ENTREE sur Mac)

En executant par exemple la commande seq (voir le man de seq) vous pourrez générer des listes numériques.

TP : Faites un script qui permet de passer un répertoire en paramètres et qui affiche pour chaque fichier présent dans le répertoire le nombre de lignes. A la fin du script, il faut afficher le nombre total de lignes de tous les fichers
BONUS : pour ceux qui terminent rapidement, modifiez votre script pour passer un second paramètre, le type d'extension que l'ont désire parser (ex : log, ex : conf). Dans ces cas, le script devra ne parser que les fichiers de type xxx.