SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Programmation shell
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))
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
Exemple
$cat prog1.sh
#!/bin/sh
date
$chmod a+x prog1.sh
$./prog1.sh
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}
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
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 = $?"
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
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
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
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)
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
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
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
Entrée standard
Par la commande
read variable
Exemples :
#!/usr/bin/sh
read v
echo $v
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
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
Exemples
$cat prog.sh
#!/bin/sh
if [ $# = 0 ]; then
echo "Il n’y a pas de parametres“
else
echo "il y a $# parametres"
fi
Aiguillages
case <chaine> in
<motif> ) <liste de commandes> ;;
............
............
<motif> ) <liste de commandes> ;;
esac
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
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
Itération bornée
for variable in liste
do actions
done
for (( init; cond; steep ))
do shell_COMMANDS
done
#!/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
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
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
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
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
crond
Exécution périodique
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.
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 ...
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
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
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
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"
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)

Weitere ähnliche Inhalte

Ähnlich wie programmation_shell_2022 (1).pptx

A la découverte de redo
A la découverte de redoA la découverte de redo
A la découverte de redoThierry Gayet
 
les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)Souhaib El
 
0079-cours-linux-base.ppt
0079-cours-linux-base.ppt0079-cours-linux-base.ppt
0079-cours-linux-base.pptAugustoMoundoh1
 
0079-cours-linux-base.ppt
0079-cours-linux-base.ppt0079-cours-linux-base.ppt
0079-cours-linux-base.pptMahdiHERMASSI1
 
intro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APPintro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APPfrwebhelp
 
[JK] BASH pour les utilisateurs de Windows
[JK] BASH pour les utilisateurs de Windows[JK] BASH pour les utilisateurs de Windows
[JK] BASH pour les utilisateurs de WindowsJoseph Konka
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5halleck45
 
Cours_Linux_S1_Partie 2.pptx
Cours_Linux_S1_Partie 2.pptxCours_Linux_S1_Partie 2.pptx
Cours_Linux_S1_Partie 2.pptxKhalil BOUKRI
 
Cmd dos sous windows
Cmd dos sous windowsCmd dos sous windows
Cmd dos sous windowsSelman Dridi
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Joël Séguillon
 
Petit precis des_commandes_unix_utiles_a_ubuntu
Petit precis des_commandes_unix_utiles_a_ubuntuPetit precis des_commandes_unix_utiles_a_ubuntu
Petit precis des_commandes_unix_utiles_a_ubuntuEl7fe Eternal
 
Processus pére fils
Processus pére filsProcessus pére fils
Processus pére filsSelman Dridi
 

Ähnlich wie programmation_shell_2022 (1).pptx (20)

A la découverte de redo
A la découverte de redoA la découverte de redo
A la découverte de redo
 
les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)
 
Chapitre 3 Linux
Chapitre 3 LinuxChapitre 3 Linux
Chapitre 3 Linux
 
Ruby Pour RoR
Ruby Pour RoRRuby Pour RoR
Ruby Pour RoR
 
Boot
BootBoot
Boot
 
0079-cours-linux-base.ppt
0079-cours-linux-base.ppt0079-cours-linux-base.ppt
0079-cours-linux-base.ppt
 
0079-cours-linux-base.ppt
0079-cours-linux-base.ppt0079-cours-linux-base.ppt
0079-cours-linux-base.ppt
 
Commande linux
Commande linuxCommande linux
Commande linux
 
Commandes usuelle linux
Commandes usuelle   linuxCommandes usuelle   linux
Commandes usuelle linux
 
Cours php
Cours phpCours php
Cours php
 
intro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APPintro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APP
 
[JK] BASH pour les utilisateurs de Windows
[JK] BASH pour les utilisateurs de Windows[JK] BASH pour les utilisateurs de Windows
[JK] BASH pour les utilisateurs de Windows
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
 
Cours_Linux_S1_Partie 2.pptx
Cours_Linux_S1_Partie 2.pptxCours_Linux_S1_Partie 2.pptx
Cours_Linux_S1_Partie 2.pptx
 
Cmd dos sous windows
Cmd dos sous windowsCmd dos sous windows
Cmd dos sous windows
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
 
Petit precis des_commandes_unix_utiles_a_ubuntu
Petit precis des_commandes_unix_utiles_a_ubuntuPetit precis des_commandes_unix_utiles_a_ubuntu
Petit precis des_commandes_unix_utiles_a_ubuntu
 
Tp n 5 linux
Tp n 5 linuxTp n 5 linux
Tp n 5 linux
 
PHP.pptx
PHP.pptxPHP.pptx
PHP.pptx
 
Processus pére fils
Processus pére filsProcessus pére fils
Processus pére fils
 

Mehr von ManalAg

AOP.pptx
AOP.pptxAOP.pptx
AOP.pptxManalAg
 
analex-slides.pdf
analex-slides.pdfanalex-slides.pdf
analex-slides.pdfManalAg
 
Cours05.pdf
Cours05.pdfCours05.pdf
Cours05.pdfManalAg
 
5_Modulation.pptx
5_Modulation.pptx5_Modulation.pptx
5_Modulation.pptxManalAg
 
0B.E1BACSEG1L'organisation de travail dans une entrepriseMeryemAfa (1).pptx
0B.E1BACSEG1L'organisation de travail dans une entrepriseMeryemAfa (1).pptx0B.E1BACSEG1L'organisation de travail dans une entrepriseMeryemAfa (1).pptx
0B.E1BACSEG1L'organisation de travail dans une entrepriseMeryemAfa (1).pptxManalAg
 
Cours XML_2019_final (1).ppt
Cours XML_2019_final (1).pptCours XML_2019_final (1).ppt
Cours XML_2019_final (1).pptManalAg
 
3_Multiplexage_TDM_FDM_CDM.pptx.pdf
3_Multiplexage_TDM_FDM_CDM.pptx.pdf3_Multiplexage_TDM_FDM_CDM.pptx.pdf
3_Multiplexage_TDM_FDM_CDM.pptx.pdfManalAg
 
Controller_Rest.pptx
Controller_Rest.pptxController_Rest.pptx
Controller_Rest.pptxManalAg
 
Journalisation_log4J.pptx
Journalisation_log4J.pptxJournalisation_log4J.pptx
Journalisation_log4J.pptxManalAg
 
testUnitaire (1).pptx
testUnitaire (1).pptxtestUnitaire (1).pptx
testUnitaire (1).pptxManalAg
 
MSIL (1).pptx
MSIL (1).pptxMSIL (1).pptx
MSIL (1).pptxManalAg
 
03-05_Execution_Suivi des couts.pdf
03-05_Execution_Suivi des couts.pdf03-05_Execution_Suivi des couts.pdf
03-05_Execution_Suivi des couts.pdfManalAg
 
3-ADO.NET.pdf
3-ADO.NET.pdf3-ADO.NET.pdf
3-ADO.NET.pdfManalAg
 
05_La Cloture du projet.pdf
05_La Cloture du projet.pdf05_La Cloture du projet.pdf
05_La Cloture du projet.pdfManalAg
 

Mehr von ManalAg (14)

AOP.pptx
AOP.pptxAOP.pptx
AOP.pptx
 
analex-slides.pdf
analex-slides.pdfanalex-slides.pdf
analex-slides.pdf
 
Cours05.pdf
Cours05.pdfCours05.pdf
Cours05.pdf
 
5_Modulation.pptx
5_Modulation.pptx5_Modulation.pptx
5_Modulation.pptx
 
0B.E1BACSEG1L'organisation de travail dans une entrepriseMeryemAfa (1).pptx
0B.E1BACSEG1L'organisation de travail dans une entrepriseMeryemAfa (1).pptx0B.E1BACSEG1L'organisation de travail dans une entrepriseMeryemAfa (1).pptx
0B.E1BACSEG1L'organisation de travail dans une entrepriseMeryemAfa (1).pptx
 
Cours XML_2019_final (1).ppt
Cours XML_2019_final (1).pptCours XML_2019_final (1).ppt
Cours XML_2019_final (1).ppt
 
3_Multiplexage_TDM_FDM_CDM.pptx.pdf
3_Multiplexage_TDM_FDM_CDM.pptx.pdf3_Multiplexage_TDM_FDM_CDM.pptx.pdf
3_Multiplexage_TDM_FDM_CDM.pptx.pdf
 
Controller_Rest.pptx
Controller_Rest.pptxController_Rest.pptx
Controller_Rest.pptx
 
Journalisation_log4J.pptx
Journalisation_log4J.pptxJournalisation_log4J.pptx
Journalisation_log4J.pptx
 
testUnitaire (1).pptx
testUnitaire (1).pptxtestUnitaire (1).pptx
testUnitaire (1).pptx
 
MSIL (1).pptx
MSIL (1).pptxMSIL (1).pptx
MSIL (1).pptx
 
03-05_Execution_Suivi des couts.pdf
03-05_Execution_Suivi des couts.pdf03-05_Execution_Suivi des couts.pdf
03-05_Execution_Suivi des couts.pdf
 
3-ADO.NET.pdf
3-ADO.NET.pdf3-ADO.NET.pdf
3-ADO.NET.pdf
 
05_La Cloture du projet.pdf
05_La Cloture du projet.pdf05_La Cloture du projet.pdf
05_La Cloture du projet.pdf
 

programmation_shell_2022 (1).pptx

  • 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
  • 15. Entrée standard Par la commande read variable Exemples : #!/usr/bin/sh read v echo $v
  • 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
  • 18. Exemples $cat prog.sh #!/bin/sh if [ $# = 0 ]; then echo "Il n’y a pas de parametres“ else echo "il y a $# parametres" fi
  • 19. Aiguillages case <chaine> in <motif> ) <liste de commandes> ;; ............ ............ <motif> ) <liste de commandes> ;; esac
  • 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
  • 22. Itération bornée for variable in liste do actions done for (( init; cond; steep )) do shell_COMMANDS done
  • 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)