routes-linux
Vous êtes ici : ScriptShell bash tuto1

TUTORIEL script shell bash

Dans ce petit tutoriel nous allons apprendre à faire un simple script qui va ce lancer avec un argument et dire si cet argument est un fichier ou un repertoire. Pour ce faire nous avons besoin de la condition IF...then..else et de la commande test.

La commande test va nous permettre de vérifier une condition la syntaxe est la suivante :

test expression;
ou bien
[ expression ];

Point important les espaces entre l'expression et les crochets sont indispenssables.

Notre programme doit donc utiliser cette commande test pour verifier 3 points :
  • Tester si le fichier existe
  • Tester si l'argument est un fichier
  • Tester si l'argument est un repertoire
Il existe des options pour travailler sur un fichier et qui sont utilisées avec le test, ces options sont les suivantes :
    -e il existe
    -f c'est un fichier
    -d c'est un repertoire
Il faut maintenant comprendre ce qu'est un argument. L'argument se choisi sur la ligne de commande après avoir saisie le nom du programme comme ceci :
$./script1.sh < argument >
Lors du lancement du programme l'argument est placé dans une variable spéciale géré par le système, la valeur est récupérable dans la variable spéciale : $1 le 1 correspond au premier argument si notre programme devait disposer de plusieurs arguments les valeurs seraient récupérables avec :
    $1 pour le premier argument
    $2 pour le second
    $3 pour le troisième
    $4 pour le quatrième
    etc.. jusqu'a $9
La variable $0 contient le nom du script. Le nombre d'arguments passés au script est stoqué dans la variable spéciale $#.
Pour vous donner un exemple de ce qui a été dit nous avons la condition Si..Alors..sinon le test est dans ce test les options du fichiers et la valeur de l'argument, ce qui pourrai nous donner :
if [ ! -e "$1" ]; then
	commande 1...
elif [ -f "$1" ]; then
	commande 2...
elif [ -d "$1" ]; then
	commande 3...
fi
Si nous suivons cette syntaxe, en français cela donnerai :

Si l'argument n'existe pas excuter commande 1
if [ ! -e "$1" ]; then
commande 1...
Sinon si l'argument est un fichier éxécuter commande 2
elif [ -f "$1" ]; then
commande 2...
Sinon si c'est un repertoire éxécuter commande 3
elif [ -d "$1" ];then 
commande 3...
fin du si
fi
la ligne if [ ! -e "$1" ]; then doit être bien comprise le ! est important il va nous permette de faire le test à l'envers en rapport avec la négation c'est un opérateur logique il existe d'autres opérateurs logiques de bases le ET et le OU le ! ce traduit par NON. Si vous ne savez ce qu'est un opérateur logique lisez ceci.

Dans commande 2 nous pourrions mettre echo -e "C'est un fichier" et commande 3 mettre echo -e "C'est un répertoire"

Note*: l'option -e de echo permet d'afficher les caractère spéciaux comme les apostrophes, les couleurs.

Pour conclure voici le resultat de ce raisonement :
if [ ! -e $1 ]; then
	echo -e "n'existe pas"
	elif [ -f "$1" ]; then
		echo -e "C'est un fichier"
	elif [ -d "$1" ]; then
		echo -e "C'est un repertoire"
	fi
fi
Dans tout script shell il faut préciser quel shell vous utiliser dans notre cas c'est le bash, vous devez mettre en tout premier cette ligne :
#!/bin/bash
notre script touche peu être bientôt à ça fin voila le résultat de notre script pratiquement fini :
#!/bin/bash 
if [ ! -e "$1" ]; then 
	echo -e "n'existe pas !"
	elif [ -f "$1" ]; then
		echo -e "c'est un fichier"
	elif [ -d "$1" ]; then
		echo -e "c'est un repertoire"
	fi
fi
Sauvegardez le fichier en script1.sh puis attribué lui le droit d'éxécution avec la commande chmod comme ceci :
$chmod u+x script1.sh
Maintenant créez un fichier avec la commande touch et un repertoire avec la commande mkdir :
$touch fichier.tmp
$mkdir repertoire
Il ne reste plus cas lancer le script de cette manière pour tester fichier.tmp :
$./script1.sh fichier.tmp
c'est un fichier
$
Pour repertoire :
$./script1.sh repertoire 
c'est un repertoire 
$
Super ça fonctionne bien non ?
oui mais ça pourrai être mieux...si vous lancez le script1.sh sans argument il vous affiche : n'existe pas !
C'est toujour mieux qu'un message d'erreur de syntaxe ou autre chose mais pour faire vraiment propre nous allons rajouter une condition qui test si l'argument est présent ou non si dans le cas ou il n'est pas présent afficher :
    Erreur script1.sh a besoin d'un argument !
Nous allons donc devoir tester avec un if test then supplementaire. Nous savons comme il a été dit plus haut dans ce tutoriel, que $# reçoit le nombre d'argument passé au script nous savons faire maintenant un test de condition mais comment tester un nombre ?
aussi facilement qu'un fichier les nombres possèdent aussi leurs options pour travailler avec :
    -eq égal
    -ne different
    -lt strictement inférieur
    -gt sctrictement supérieur
    -le inférieur ou egal
    -ge supérieur ou egal
Ici nous aurons donc besoin d'un test de difference "-ne" qu nous pouvons traduire par :
if [ $# -ne 1 ]; then
	echo -e "Erreur $0 a besoin d'un argument !"
fi
Rajoutons maintenant ce test à notre script qui en version finale nous donne ceci :
#!/bin/bash
if  [ $# -ne 1 ]; then
echo -e "Erreur $0 a besoin d'un argument"
	elif [ ! -e "$1" ]; then
		echo -e "n'existe pas"
	elif [ -f "$1" ]; then
		echo "c'est un fichier"
	elif [ -d "$1" ]; then
		echo "c'est un repertoire"
	fi
     fi
fi
Version finale ?
Peu être pas tout de suite (je sais je suis chiant...) mais il faut savoir que toutes commandes du shell retourne des valeurs pour dire au shell si la commande c'est bien éxécutée ou si il y a eu une erreur, on appel cette valeur le code de retour, c'est une valeur numérique et entière, cette valeur est stoquée dans la variable spéciale $?, la commande test retourne une valeur de 0 si le test c'est bien passé sinon elle retourne une valeur differente de 0 pour signifier quelle est fausse.

Dans notre script1.sh nous avons les 2 premier tests ou il peu y avoir eventuelement une erreur, les deux autres tests sont éxécutez si il n'y a pas d'erreur le code de retour sera forcement 0, pour les 2 premiers test il y aura un code de retour different de 0 on utilise la commande exit la valeur de code de retour, modifion le script de cette manière :
 
#!/bin/bash
if  [ $# -ne 1 ]; then
	echo "Erreur $0 a besoin d'un argument"
	exit 1 
	elif [ ! -e "$1" ]; then
    		echo "existe pas"
		exit 1
	elif [ -f "$1" ]; then
		echo "c est un fichier"
		exit 0
	elif [ -d "$1" ]; then
		echo "c est un repertoire"
		exit 0
	fi
   fi
fi
C'est terminé, çi çi c'est vrai pas besoin d'en rajouter pour ce script, j'espère que vous avez compris le mecanisme et la logique du script dans le cas contraire laissez un mesage dans le forum réservé à la programmation.

Ecrit par : Mazzaru Le 24/07/2003

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.00255 secondes | Compression gZip active ]
Poids XHTML : 14.17 ko (17.51 ko non compressé) - CSS : 5.05 ko
Eléments chargés : 7.16 ko