2. Programmation shell
Ensemble de commandes dans un fichier acceptant des
paramètres:
- Non déclaratif
- Interprété
Les paramètres sont repérés par leur position quand on
appelle le script.
Plusieurs Shells:
- Les Bourne Shells (sh,ksh,,bash)
- Les C-Shells (csh,tcsh))
3. Ordre des opérations
1. Ouvrir un fichier texte et mettre en première ligne le shell
#/bin/sh
2. Ecrire le rogramme
3. Le rendre exécutable :
chmod a+x programme
5. Variables utilisateurs
On peut créer des variables V par affectation (sans déclaration) et
les utiliser avec $V
Manipulation des expressions arithmétiques avec expr
#!/bin/sh
C="abc"
N=12
echo "variable C = " ${C}
echo "variable N = " ${N}
echo "variable N+1 = c" ; expr ${N} + 1
N=‘expr ${N} + 10‘
echo "variable N apres N=N+10= " ${N}
6. Variables prédéfinies
$* ou $@ : liste des paramètres
$#: nb de paramètres
(sans le nom de la commande)
$$ ou $0 : nom processus en cours
$?: code retour de la dernière commande exécutée
$1: 1er paramètre
$2 : 2ème paramètre
...........
$n : nème paramètre
7. Exemples
$cat prog.sh
#!/usr/bin/sh
echo "Nombre de parametres = " $#
echo “Nom programme = " $0
echo "Parametre numero 1 = " $1
echo "Nombre de fichiers dans le Répertoire $1 = " ;
ls $1 | wc -l
echo "code de retour de ls = $?"
8. apostrophes ‘.....’
Chaîne où tous les caractères spéciaux sont désactivés
$ echo '$PWD'
$PWD
$ echo $PWD
/home/staff/adam
$ ls 'f*.c'
f*.c : No such file or directory
$ ls f*.c
file.c f1.c
9. anti-apostrophes `..` ou $(…)
`cmd` ou $(cmd)
Chaîne résultat de la commande cmd
$ ls
f.c f1.c g.sql
$ X=`ls`; echo $X
f.c f1.c g.sql
10. guillemets “...”
Chaîne où tous les caractères spéciaux sont désactivés
sauf le dollar ($), l'anti-slash () et l'anti-apostrophe (`)
$ echo ""$PWD""
"/usr/bin“
$ ls "f*.c" f*.c
f*.c : No such file or directory
f.c f1.c
28
11. La commande test
Syntaxe test exp ou [exp];
réalise des tests et restitue le résultat sous la forme d’un
code retour
(=0 si OK, #0 sinon)
Quelques exemples de exp :
Opérateurs booléens :
! (négation)
&& ou -a (conjonction)
|| ou –o (disjonction)
12. Tests sur les fichiers (et sur les répertoires) :
• -e fichier Vrai si le fichier/répertoire existe
• -s fichier Vrai si le fichier à une taille supérieure à 0
• -z fichier Vrai si le fichier fait 0 octet (donc si il est vide)
• -r fichier Vrai si le fichier/répertoire est lisible
• -w fichier Vrai si le fichier/répertoire est modifiable
• -x fichier Vrai si le fichier est exécutable ou si le répertoire est
accessible
• -O fichier Vrai si le fichier/répertoire appartient à l’utilisateur
• -G fichier Vrai si le fichier/répertoire appartient au groupe de
l’utilisateur
• -b nom Vrai si fichier périphérique de type bloc
La commande test
13. Opérateurs de comparaison (suite)
Tests sur les fichiers (et sur les répertoires, suite) :
• -c nom Vrai si nom représente un périphérique (pseudo-
fichier) de type caractère (terminaux, modems et port
parallèles par exemple)
• -d nom Vrai si nom représente un répertoire
• -f nom Vrai si nom représente un fichier
• -L nom Vrai si nom représente un lien symbolique
• -p nom Vrai si nom représente un tube nommé
• f1 -nt f2 Vrai si les deux fichiers existent et si f1 est plus récen
que f2
• f1 -ot f2 Vrai si les deux fichiers existent et si f1 est plus ancien
que f2
• f1 -ef f2 Vrai si les deux fichiers représentent un seul et
même fichier
14. Opérateurs de comparaison
Tests sur les entiers :
• entier1 -eq entier2 Vrai si entier1 est égal à entier2
• entier1 -ge entier2 Vrai si entier1 est supérieur ou égal à en-
tier2
• entier1 -gt entier2 Vrai si entier1 est strictement supérieur à
entier2
• entier1 -le entier2 Vrai si entier1 est inférieur ou égal à en-
tier2
• entier1 -lt entier2 Vrai si entier1 est strictement inférieur à
entier2
• entier1 -ne entier2 Vrai si entier1 est différent de entier2
16. Commandes exec
exec : commande s’exécute en remplaçant le processus
courant
exec $cmd
# Tout ce aui suit ne sera pas exécuté
#!/usr/bin/sh
# car le code de $cmd a remplacé celui ci
echo ligne 1
echo ligne 2
echo ligne 3
read cmd
17. Sélection
if <crit 1>; then
<liste de commandes 2>
elif <crit 2>; then
<liste de commandes 3>
fi
….
else
<liste de commandes 3>
fi
20. Exemple (cp)
$cat prog.sh
#!/usr/bin/sh
case $# in
0) pwd ;;
1) If [ -f $1 ] then
cat $1
else
echo "fichier $1 inexistant"
fi ;;
2) if [ -f $2 ] then
echo "fichier $2 existant"
else
cat $1 > $2
fi ;;
*) echo "2 parametres attendus au lieu de $* ";;
esac
21. Structures de contrôle
Exemple 2
echo "Voulez vous continuer le programme ?"
read reponse
case $reponse in
[yYoO]*) echo "Ok, on continue";;
[nN]*) echo "$0 arrete“
exit 0;;
*) echo "ERREUR de saisie"
exit 1;;
esac
23. #!/bin/bash
for file in /etc/*
do
if [ "${file}" == "/etc/resolv.conf" ]
then
countNameservers=$(grep -c nameserver /etc/resolv.conf)
echo "Total ${countNameservers} nameservers defined in ${file}"
break
fi
done
#!/bin/bash
prefix=$1
suffix=$2
new_prefix=$3
for i in $(ls ${prefix}*.${suffix});do
mv $i $(echo $i | sed s/${prefix}/${newn_prefix}/g)
done
rename_files.sh FILE txt TEXT (renomme FILE1.txt… FILE35.txt en TEXT1.txt ….TEXT35.txt)
Exemples
Cherche /etc/resolv.conf puis compte le nombre de ligne nameserver qu’il contient
24. Itération non bornée
while ( conditions ) ; do actions ; done
until ( conditions ) ; do actions ; done
#!/usr/bin/sh
i=1
while [ $i -le $# ] ; do
eval "echo parametre $i = $$i " ;
i=‘expr $i + 1‘ ;
done
25. Opérateur shift
Décalage logique à gauche des paramètres
On s’en sert souvent pour parcourir la liste des paramètres
Exemples
#!/usr/bin/sh
while [ $# -gt 0 ] ; do
echo $1
shift
done
26. Here Document
Exemples
cat <<HELP
prog – ce programme ………
USAGE: prog répertoire fichier1 fichier2 ...
Options: -v : mode bavard, -p : prend en compte ………., -s : valide la ………
EXEMPLE: prog –v –s /etc/ /etc/hosts
HELP
Moyen pratique pour envoyer plusieurs lignes de texte à une commande.
C'est utile pour écrire un texte d'aide dans un script sans avoir à mettre une
commande echo au début de chaque ligne. Un "here document"
commence par << suivi par une chaîne de caractères qui doit également
apparaître à la fin du here document
27. La récursion
Les procédures shell peuvent s’appeler elles-mêmes;
Exemple de find:
$cat prog.sh
#!/bin/sh
fic=$1
dir=$2
cd $dir
if( test -f $fic ) then
echo "Le fichier est dans le repertoire " ; pwd
exit 0
fi
for i in * ; do
if [-d $i ] then
$HOME/prog.sh $fic $i ;
fi ;
done
29. crond
- Pour spécifier des utilisateurs ayant le droit d’utiliser crond ou ceux n’ayant
pas ce droit. On utilise les fichiers /etc/cron.allow and /etc/cron.deny.
- Autoriser user à utiliser crond: En tant que root on ajoute user dans le
fichier /etc/cron.allow s’il existe. S’il créer le.
• Si le fichier /etc/cron.allow existe, seul les utilisateurs mentionnés auront le
droit d’utiliser crond.
• Si le fichier /etc/cron.allow n’existe pas, c’est le fichier /etc/cron.deny qui est
pris en compte : les utilisateurs mentionnés n’auront pas le droit d’utiliser
crond.
• Si aucun des deux fichiers n’existe, seul le super utilisateur (root) aura le droit
d’utiliser la commande cron
• Remarque : un fichier /etc/cron.deny vide signifie que tout les
utilisateurs peuvent utiliser crond.
30. crond
• Afin d'éditer la table cron, il suffit d'exécuter la commande suivante :
crontab -e
Cette commande a pour effet de lancer vi présentant la table actuelle . Chaque
entrée de la table correspond à une tâche à exécuter :
mi he jo_mo mo jo_se command
jo_se : comprise entre 0 et 7, le dimanche étant 0 ou 7, le lundi 1, etc ...
31. crond
métacaractères :
* : toutes les valeurs de ce champ.
/ : permet de spécifier une répétition.
- : permet de définir une plage.
, : pour spécifier plusieurs valeurs.
* /5 * * *
Exécuter une commande toutes les cinq minutes.
0 22 * * 1-5
Exécuter une commande tous les jours de la semaine du lundi ou vendredi à 22h.
17 19 1,15 * *
Premier jour et quinzième jour du mois à 19h17
crontab -l // liste
Crontab -r // supp
32. Exercice 1
1 – Ecrire un script nommé decomp qui peut
décompresser automatiquement des fichiers bzip2, gzip
et zip
2- Ecrire un script shell nommé renome qui renomme de
nombreux fichiers et utilise un "here document" dans
son texte d'aide.
Exemple : renome ‘htm$' 'html' /home/user/rojet_web/*.htm
33. decomp
#!/bin/sh
ftype=`file $1`
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
gunzip "$1" ;;
"$1: bzip2 compressed"*)
bunzip2 "$1" ;;
*) error "Le fichier $1 ne peut pas être décompressé avec decomp";;
esac
34. rename (1/2)
#!/bin/sh
# Si nous avons moins de 3 arguments, on affiche le message d'aide
if [ $# -lt 3 ] ; then
cat <<HELP
renomme plusieurs fichiers USAGE: ren 'regexp' 'replacement' files...
EXEMPLE: renomme tous les fichiers *.HTM en *.html: ren 'HTM$' 'html' *.HTM
HELP
exit 0
fi
OLD="$1"
NEW="$2"
35. shift
shift
# la variable $* contient maintenant tous les fichiers.
for file in $*; do
if [ -f "$file" ] ; then
newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
if [ -f "$newfile" ]; then
echo "ERREUR: $newfile existe deja"
else
echo "fichier $file renommé en $newfile ..."
mv "$file" "$newfile"
fi
fi
done
rename (2/2)