routes-linux
Vous êtes ici : Tutoriel 2
Voici les differentes notions abordées dans ce tutriel 2 :
  1. Les fonctions
  2. les Menus avec choix (de type case esac)
  3. Les test conditionnels
En restant le plus simple possible, orienté débutant en programmation.

Script Shell Bash (Musepack plugin)



Auteur : Mazzaru

Mail : mazzaru[at]scooba[dot]org

Langage : Shell bash

Systeme : Gnu/linux

Dernière Modif : 09/09/04

Version : 1.1



Voici un script shell bash qui va nous servir de base pour ce tutoriel. Il éxécute une suite de commande qui permet d'installer le plugin Musepack pour xmms.
Un test conditionnel permet de savoir si l'utilisateur éxécute ce script en root, alors il lui affiche un message d'avertissement.
#!/bin/sh
#Script auto install plugin Musepack for Xmms
#Musepack-xmms v0.0.1a

if [ "$UID" -eq "0" ]; then 
       echo "Don't run this script as root"
       exit 1
fi

# télécharge le plugin
wget http://www.personal.uni-jena.de/~pfk/MPP/bin/xmms-0.98.zip

#décompresse le plugin avec unzip
unzip xmms-0.98.zip

#modifie les droits du plugin en 555 qui signifie : r-xr-xr-x
chmod 555 xmms-musepack-0.98.so

#couper/coller dans le répertoire des plugins xmms
mv xmms-musepack-0.98.so ~/.xmms/Plugins/

#Suppresion des fichiers extraits de l'archive ainci que l'archive elle même
rm -f README_mpc* && rm -f Wanted && rm -f xmms-0.98.zip && rm -f ChangeLog
Pour étudier la notions de fonction dans un script nous allons ajouter au script une option de désinstallation du plugin. Nous allons aussi créer une fonction permettant d'installer le plugin. Pour faire le lien entre les 2 fonctions il faut obligatoirement un choix donné à l'utilisateur par exemple :
    1 Installer le plugin
    2 Désinstaller le plugin
Grace à ce choix notre script pourra éxécuter la fonction correspondante.

On peu comparer une fonction bash à une commande pesonnaliser. la syntaxe d'une fonction bash est la suivante :
nom_de_la_fonction() {

commande a éxécuter

} fermuture de la fonction

Pour vous faire comprendre cette comparaison, créez sur la ligne de commande d'un terminal une fonction :
$TEST() {
>echo -e "ma commande perso s'appel TEST"
>ls -l
>echo "affichage du repertoire courrant terminé."
>}
$
Une fois que vous avez tapez l'arrobase de fermture sur une ligne cela indique a bash que votre fonction est terminée.
Maintenant la commande est sauvegardée, il vous suffit de taper TEST dans le même terminale pour avoir le résultat :
$TEST
ma commande perso s'appel TEST
drwxr-xr-x    2 root     ftp          1024 Dec 13 04:02 .
drwxr-xr-x    4 root     ftp          1024 Dec 13 04:02 ..
-rw-r--r--    1 root     ftp        562314 Dec 12 15:48 openssh-2.3.0p1-1.src.rpm
-rw-r--r--    1 root     ftp       1884063 Dec 12 15:48 openssl-0.9.5a-3.src.rpm
affichage du repertoire courrant terminé.
$

1 - Fonction installation :

Pour ne pas entrer en conflit avec une commande system le mieux est d'assigner à notre fonction un nom en majuscule le plus explicite possible sur la tâche qui lui est induite.

Appelons notre fonction d'installation INSTALL_PLUGIN(). INSTALL_PLUGIN() va regrouper toutes les tâches suivantes :
  • téléchargement
  • dézipage
  • couper/coller
  • suppression
voila comment cela se présente en syntaxe bash :
function INSTALL_PLUGIN() {

wget http://www.personal.uni-jena.de/~pfk/MPP/bin/xmms-0.98.zip
unzip xmms-0.98.zip
chmod 555 xmms-musepack-0.98.so
mv xmms-musepack-0.98.so ~/.xmms/Plugins/
rm -f README_mpc* && rm -f Wanted && rm -f xmms-0.98.zip && rm -f ChangeLog
}
La fonction INSTALL_PLUGIN() est terminée

2 - Fonction de désinstallation :

La fonction de désinstallation va nous amener à réflechir à une premiere idée : Comment savoir si le plugin à déjà été désinstallé ?

La solution reste très simple. Il suffit défectuer un test conditionnel sur le chemin ou "PATH" du plugin. D'abord faites la fonction dans sa tâche de base, un vulgaire rm -f du plugin.
function UNINSTALL_PLUGIN() {

rm -f ~/.xmms/Plugins/xmms-musepack-0.98.so
}
Voila maintenant cette même fonction avec le test conditionnel qui permettra au script de détecter si le plugin est déjà installé. Utilisons la syntaxe suivante :
function UNINSTALL_PLUGIN() {

if [ ! -e ~/.xmms/Plugin/xmms-musepack-0.98.so ]
then
         echo "Plugin already uninstall"
	 exit 0
else
         rm -f ~/.xmms/Plugins/xmms-musepack-0.98.so
         exit 0
fi
}
Nos 2 fonctions sont terminées, il faut maintenant créer le menu qui va permettre à l'utilisateur d'installer ou de désinstaller le plugin. On a donc forcement besoin d'une saisie utilisateur pour qu'il transmet son choix à notre script, il nous faut donc une variable pour le contenir. Le choix pourrait être géré par une combinaison de test conditionnel, mais pour rester le plus pédagogique possible, utilisons l'instruction :
case $VARIABLE in 
    choix 1)commande 1;;
    choix 2)commande 2;;
    choix 3)commande 3;;
    ...
    etc... 
esac
voici le menu qui sera présenté à l'utilisateur :
echo "Musepack-xmms install script v0.1"
echo ""
echo "1 - Install plugin Musepack"
echo "2 - Uninstall plugin Musepack"
echo ""
echo "Choice : "
read CHOIX
L'instruction "read" nous permet de capturer la saisie de l'utilisateur, pour être utilisée par l'instruction case esac comme ceci par notre script :
case $CHOIX in
        1)INSTALL_PLUGIN;;
	2)UNINSTALL_PLUGIN;;
	*)exit 0;;
esac
Rassemblons maintenant toutes nos étapes en commençant par les fonctions puis le menu.
Notre script aura la structure suivante :
    #!bin/bash
  • test d'utilisation non root
  • fonction d'installation du plugin
  • fonction de désinstallation du plugin
  • menu pour l'utilisateur
Pourquoi écrire les fonctions avant le menu ?

Quand l'interprêteur de commande bash va lire notre script il faut qu'il initialise d'abord nos fonction avant leurs appels dans le script comme nos fonctions sont des commandes, il a besoin de les enregistrer en mémoire avant de les utiliser (logique).
Si nous avions initialisé le menu avant nos 2 fonctions, bash aurai éxécuté le menu mais n'aurait pas pue satisfaire le choix de l'utilisateur puisque il n'aurai pas pue lire nos 2 fonctions.
Exemple au choix N° 1 de l'utilisateur, l'interpréteur aurait répondu :
bash: INSTALL_PLUGIN: commande not found
Comme vous pouvez le voir, j'ai mis le test d'utilisation non root avant les 2 fonctions, justement pour qu'il effectue tout de suite la vérification et qu'il n'est pas le temps d'initialiser nos 2 fonctions dans le cas ou l'utilisateur aurait lancé le script en tant que root.
C'est tout simplement de la logique de programmation basique afin d'eviter du temps de calcul inutile.
Voici la finalisation de tout ce qui à été dit jusqu'a maintenant :
#!/bin/sh
#Script Musepack auto install

if [ "$UID" -eq "0" ]; then
       echo "Don't run this script as root"
       exit 1
fi

function INSTALL_PLUGIN() {

wget http://www.personal.uni-jena.de/~pfk/MPP/bin/xmms-0.98.zip
unzip xmms-0.98.zip chmod 555 xmms-musepack-0.98.so mv xmms-musepack-0.98.so ~/.xmms/Plugins/ rm -f README_mpc* && rm -f Wanted && rm -f xmms-0.98.zip && rm -f ChangeLog exit 0 } function UNINSTALL_PLUGIN() { if [ ! -e ~/.xmms/Plugin/xmms-musepack-0.98.so ]; then echo "Plugin already uninstall" exit 0 else rm -f ~/.xmms/Plugins/xmms-musepack-0.98.so exit 0 fi } echo "" echo "Musepack-xmms install script v0.1" echo "" echo "1 - Install plugin Musepack" echo "2 - Uninstall plugin Musepack" echo "" echo "Choice : " read CHOIX case $CHOIX in 1)INSTALL_PLUGIN;; 2)UNINSTALL_PLUGIN;; *)exit 0;; esac
Vous pouvez maintenant sauver votre script et lui assigner le droit déxécution et le lancer :
$chmod 755 Musepack-xmms
$./Musepack-xmms
Musepack-xmms install script v0.1

1 - Install plugin Musepack
2 - Uninstall plugin Musepack

Choice : 1
$
Ce petit tutoriel est terminé.
Vous pouvez laisser vos impressions, suggestions, problêmes sur le forum du site, j'espère que vous avez lu jusqu'au bout bon courage dans votre étude du script shell.


Forum routes-linux (en ligne)

Liens (en travaux)

Téléchargements (en travaux)


Légende liens

Lien interne : interne
Lien sortant : sortant
Lien téléchargement : téléchargement
Lien Anglophone : Anglophone











- [ Powered by Itseasy v0.3.7 | Thème : Light Blue par Vanquish ] -
Les informations ne sont données qu'à titre indicatif.
© routes-linux, tous droits réservés - Reproduction interdite.

Administrer Itseasy

[ Page générée en 0.00358 secondes | Compression gZip active ]
Poids XHTML : 15.98 ko (19.34 ko non compressé) - CSS : 5.05 ko
Eléments chargés : 8.99 ko