Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

programmation_shell_2022 (1).pptx

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Prochain SlideShare
Chapitre_Shell.pdf
Chapitre_Shell.pdf
Chargement dans…3
×

Consultez-les par la suite

1 sur 35 Publicité

Plus De Contenu Connexe

Similaire à programmation_shell_2022 (1).pptx (20)

Plus récents (20)

Publicité

programmation_shell_2022 (1).pptx

  1. 1. Programmation shell
  2. 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. 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
  4. 4. Exemple $cat prog1.sh #!/bin/sh date $chmod a+x prog1.sh $./prog1.sh
  5. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 15. Entrée standard Par la commande read variable Exemples : #!/usr/bin/sh read v echo $v
  16. 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. 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. 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. 19. Aiguillages case <chaine> in <motif> ) <liste de commandes> ;; ............ ............ <motif> ) <liste de commandes> ;; esac
  20. 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. 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. 22. Itération bornée for variable in liste do actions done for (( init; cond; steep )) do shell_COMMANDS done
  23. 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. 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. 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. 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. 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
  28. 28. crond Exécution périodique
  29. 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. 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. 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. 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. 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. 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. 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)

×