Le but de cette section n'est absolument pas d'expliquer la programmation et la configuration bash (loin de moi cette prétention ....), pour apprendre le bash, la lecture de Le Shell Bash, configuration et programmation" est fortement recommandée (sinon consultez la page de manuel sur bash "man bash").
Le shell bash, comme les autres shells (korn shell, C shell), permet ce qui a été vu précédemment, c'est-à-dire de lancer des commandes, de créer des pipes, de connecter par pipes des commandes ...
Mais avec les commandes décrites depuis le début de ce document et à l'aide d'une syntaxe proche de celle des langages de programmation courants comme le C ou le Pascal, on peut réaliser des scripts permettant d'automatiser certaines tâches. Nous n'allons pas décrire ici en détail ce language de programmation mais simplement montrer quelques exemples :
Un exemple, on utilise souvent cette syntaxe pour décompresser et désarchiver un fichier au format fichier.tar.gz :
gzip -dc fichier.tar.gz | tar xfBp -
(on peut aussi utiliser uniquement les options de la commande tar pour réaliser ceci.)
Il est assez pénible d'avoir à taper systématiquement cette longue commande.
Un script bash peut simplifier les choses :
#!/bin/bash
gzip -dc $1 fichier.tar.gz | tar xfBp - On enregistre ensuite le fichier sous le nom "montar" puis on le rend exécutable grace à la commande suivante :
chmod +x montar
pour décompressez un fichier il vous suffira de taper ceci :
montar fichier.tar.gz
Quelques remarques :
- Tout script bash doit commencer à la première ligne par une invocation du shell :
#!/bin/bash
- les paramètres passés sur la ligne de commandepar l'utilisateur du script sont pour ce dernier des variables nommées : $1 pour le premier, $2 pour le deuxième, $3 pour le troisième, etc ... $0 étant la variable représentant le nom de la commande.
Voila qui simplifie déjà suffisamment la vie.
Nous pourrions améliorer ce script en voyant d'abord de quoi est composé le fichier.tar.gz avant la décompression.
#!/bin/bash
tar tvzf $1
gzip -dc $1 | tar xfBp -
Il serait cependant plus utile de pouvoir accepter ou non le désarchivage du fichier selon les informations fournies par la commande tar tvzf :
#!/bin/bash
tar tvzf $1
echo -n "Voulez vous désarchiver l'archive ? (o/n) : "
read archi
if [ $archi = "o" ]
then
gzip -dc $1 | tar xfBp -
else
exit
fi
La commande echo permet d'afficher un message sur la console, et l'option n permet de ne pas faire de retour chariot en fin de ligne.
La commande read attend une réponse de l'utilisateur, ici la réponse sera stockée dans la variable archi.
Les crochets ([ ]) encadrent tous types d'expression.
Enfin, la condition if permet de tester la valeur de la réponse donnée par l'utilisateur.
Voici la construction typique de l'instruction if :
if condition
then
instruction
else
instruction
fi
Si vous souhaitez insérer plusieurs conditions "if" utilisez la syntaxe suivante :
if condition
then
instruction
elif condition
then
instruction
else
instruction
fi
Nous pourrions utiliser aussi un menu qui nous permettrait de choisir entre une décompression immédiate ou une visualisation du contenu de l'archive :
#!/bin/bash
PS3='votre choix ?'
select choix in "tar tvzf" "tar xvzf"
do
$choix $1;
done
La construction select permet de générer des menus avec une grande facilité.
PS3 est une variable qui permet de stocker une chaîne d'invite qui est utilisée par select.
"choix" est le nom de la variable qui contiendra un des éléments de la suite qui suit le mot clé in. Dans notre cas, "choix" contiendra soit la chaîne "tar tvzf" ou la chaîne "tar xvzf".
Dans la construction do... done, nous placons les commandes que nous voulons executer. Ici "$choix" contiendra donc soit "tar tvzf" soit "tar xvzf" et "$1" contiendra l'argument (ici le nom du fichier compressé) que l'on aura indiqué à l'execution de notre script.
Si notre script s'appelle "ctgz", son exécution se déroulera ainsi :
[delcros@mistra binaire]$ ./ctgz fichier.tar.gz
1) tar tvzf
2) tar xvzf
votre choix ?
L'utilisateur n'a plus qu'à taper "1" ou "2".
select nom [in liste]
do
instructions utilisant la $nom
done
Comme pour tout langage de programmation, bash contient des instructions de répétition :
La boucle for permet de réaliser une instruction un nombre de fois précis. Sa syntaxe est très proche de celle de select :
for nom [in liste]
do
instructions utilisant $nom
done
exemple :
#!/bin/bash
for fichier in $@
do
tar tvzf $fichier
done
Ce petit script permet de regarder le contenu de plusieurs fichiers compressés. $@ contient la liste des fichiers que l'utilisateur aura spécifié en argument de la ligne de commande :
[delcros@mistra binaire]$ ./utgz5 fichier1.tar.gz fichier2.tar.gz
La boucle while ainsi que la boucle until effectue la même chose que for à la différence que celle-ci répète une instruction tant que (while) ou jusqu'à ce que (until) une condition soit vérifiée.
Voici un exemple avec la boucle until :
#!/bin/bash
until tar tvzf $1; do
echo "tentative de decompression"
done
Avec cette boucle, tant que le fichier n'aura pas pu être décompressé et désarchivé, la commande tar sera répétée indéfiniment ... pour sortir de la boucle utilisez la combinaison de touches Ctrl-c.
Avec ces quelques structures de contrôle on voit bien la simplification des tâches quotidiennes que bash peut permettre, au prix d'un effort réduit.
La personnalisation des variables d'environnement :
bash contient des variables qui permettent d'adapter son environnement à ses besoins :
Il existe un fichier qui met en place une grande partie des variables d'environnement : le fichier .bash_profile (ou .profile).
Pour que les variables d'environnement soit prises en compte vous devez vous reloguer sur votre compte(avec la commande "su - nom_utilisateur (si vous avez modifié le .bash_profile) ou alors passer les variables directement en ligne de commande (dans ce cas, les variables ne seront pas enregistrées dans le .bash_profile).
Vous trouverez par exemple la variable PATH qui définit les chemins existant pour les exécutables. Si par exemple, votre chemin PATH est de la forme :
PATH=$PATH:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
et que vous souhaitez ajouter dans ce chemin un répertoire /home/delcros/binaire qui contient votre script bash ou vos programmes personnels, il vous faudra ajouter ce chemin à la variable PATH :
PATH=$PATH:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/home/delcros/binaire
(notez la présence de ":" entre chaque nom de répertoire).
La variable PS1 contient la forme de votre invite :
PS1="[\u@\h \w]" affichera votre nom d'utilisateur (\u); "@"; le nom de la machine (\w); un espace; le répertoire de travail courant (\w). Voilà ce que cela donne :
[delcros@mistra /usr/X11]
Voici une autre configuration d'invite qui contient quasiment toutes les options possibles :
PS1="[\t \d \u@\h \w \$]"
ce qui donne :
[21 : 47 : 13 Sun Apr 26 delcros@mistra /usr/X11 $] Une autre variable utile est MAIL. Normalement, vos mails arrivent dans le répertoire /var/spool/mail/nom_utilisateur
Vous pouvez placer cette variable dans votre .bash_profile avec cette forme :
MAIL=/var/spool/mail/nom_utilisateur
Les alias
Les alias sont une des choses les plus pratiques qui soient. Régulièrement on utilise les mêmes commandes avec parfois de nombreuses options. Les alias se placent habituellement dans le fichier de configuration .bashrc. Voici un exemple classique d'alias :
alias l="ls --color=auto" Avec cet alias, vous n'aurez plus besoin de spécifier systématiquement l'option "--color" qui permet de lister en couleur le contenu d'un répertoire. Il vous suffira simplement de taper l'alias "l".
Ainsi, le mini script que nous avions réalisé au début de cette section pourrait aussi se faire grâce à un simple alias :
alias montar="tar xvzf"