Scripts shell Scripts shell Execution conditionnelle Conditions sur

Transcription

Scripts shell Scripts shell Execution conditionnelle Conditions sur
Scripts shell
Jean-Sébastien Coron
Université du Luxembourg
Scripts shell
– Un script shell est un fichier qui contient une liste de commandes.
• En exécutant le fichier, ces commandes sont exécutées automatiquement.
• Utile pour automatiser des taches répétitives.
– Nouvelles instructions:
• Instruction if: exécution conditionnelle.
• Instruction for: répétition d’une suite d’instructions.
1
Exécution conditionnelle
Execution conditionnelle
– Il est possible d’exécuter une suite d’instruction sous une certaine condition.
• if [ test ]
then
commande-si-vrai
else
commande-si-faux
fi
– Le test peut être une condition sur un fichier, ou une comparaison de chaine ou de valeur.
• Ne pas oublier les espaces dans if [ test ] then
Conditions sur les fichiers
–
–
–
–
–
–
[
[
[
[
[
[
-s
-f
-d
-r
-w
-x
file
file
file
file
file
file
]:
]:
]:
]:
]:
]:
vrai
vrai
vrai
vrai
vrai
vrai
si
si
si
si
si
si
le fichier existe et est non vide.
c’est un fichier ordinaire.
c’est un répertoire.
le fichier est libre en lecture.
le fichier est libre en écriture.
le fichier est exécutable.
Exemple
– Afficher le contenu d’un fichier s’il existe.
• #!/bin/bash
if [ -f $1 ]
then
cat $1
fi
– Créer un répertoire toto s’il n’existe pas déjà.
• #!/bin/bash
if [ ! -d toto ]
then
mkdir toto
fi
Comparison de valeurs et chaines
– Entiers
• [ $X -eq $y ]: vrai si X=Y.
• [ $X -ne $Y ]: vrai si X¡¿Y.
• [ $X -lt $Y ]: vrai si X¡Y.
• [ $X -le $Y ]: vrai si X¡=Y.
– Chaı̂ne:
• [ "$A" = "$B" ]: vrai si chaine A = chaine B.
• [ "$A" != "$B" ]: vrai si chaine A ¡¿ chaine B.
Exemple
– Script pos déterminant si un nombre est positif.
• #!/bin/bash
if [ $1 -gt 0 ]
then
echo "$1 est positif"
fi
• $ pos 2
2 est positif
2
Exemple
– Script quitter demandant si l’utisateur veut quitter.
• #!/bin/bash
echo "Voulez vous quitter ?"
read rep
if [ "$rep" = y ]
then
echo "exiting..."
exit 0
fi
• $ quitter
Voulez-vous quitter ?
y
exiting...
$
Exemple
– Script fichtxt déterminant si un fichier a l’extension .txt
• #!/bin/bash
if [ "${1##*.}" = "txt" ]
then
echo $1 est un fichier .txt
else
echo $1 n’est pas un fichier .txt
fi
• $ fichtxt toto.txt
toto.txt est un fichier .txt
Combinaison de tests
– Expressions:
• [ $E -a $F ]: vrai si les expressions E et F sont vraies.
• [ $E -o $F ]: vrai si E ou F est vraie.
– Example: script demandant une valeur en 0 et 100.
• #!/bin/bash
if [ \( $1 -gt 100 \) -o \( $1 -lt 0 \) ]
then
echo "out of range"
fi
2
Liste des processus
La commande ps -s permet d’afficher la liste des processus qui s’exécutent sur une machine.
1) Donnez le résultat de la commande ps -s. Pour cela, stockez le résultat de la commande
ps -s dans un fichier temporaire (par exemple temp), et copiez le contenu de temp à l’aide
d’un éditeur de texte. Quelle commande faut-il taper ?
3
La commande grep permet de sélectionner les lignes d’un fichier (ou de l’entrée standard
si aucun fichier n’est spécifié) qui contiennent un certain motif. Par exemple,
$ ls -l | grep ’toto’
affiche uniquement les lignes du résultat de la commande ls -l qui contiennent le mot
toto.
En combinant les commandes ps -s et grep à l’aide d’un pipe, on peut donc sélectionner
les lignes qui correspondent à un nom de processus donné.
2) Quelle est la commande à taper pour faire afficher uniquement les lignes du résultat de la
commande ps -s qui correspondent au programme bash ?
La commande cut permet de sélectionner un certain groupe de caractères pour chaque
ligne d’un fichier (ou de l’entrée standard si aucun fichier n’est spécifié). En combinant les
commandes précédentes avec la commande cut, on peut donc sélectionner pour chaque ligne
uniquement le numéro du processus (son PID).
3) Quelle est la commande à taper pour faire afficher la liste des numéros de processus
correspondant au programme bash ?
4) Ecrivez un script shell pidof prenant en entrée le nom d’un programme et affichant la liste
les numéros de processus correspondant à ce programme.
$ pidof bash
1672
2888
$ pidof xterm
1025
2112
3
Boucle for
Boucle for
– La boucle for permet d’exécuter une suite d’instruction avec
une variable parcourant une suite de valeurs.
• for variable in list
do
statement
done
– La liste peut être un ensemble de fichier.
• for x in *.txt
do
statement
done
4
Boucle for
– Exemple:
• Le script:
for x in chien chat canard
do
echo "x=$x"
done
• Affiche:
x=chien
x=chat
x=canard
Traitement de fichier
– La boucle for permet d’appliquer la même suite d’instruction
à un ensemble de fichiers:
• for fichier in *
do
if [ -d "$fichier" ]
then
echo "$fichier: répertoire"
fi
done
• Affiche la liste des répertoires dans le répertoire courant.
4
Liste des fichiers
Ecrire un script list qui donne la liste des fichiers dans le répertoire courant, suivi des
répertoires. La sortie devra avoir la forme suivante:
Fichiers:
--------filename
Répertoires:
-----------directories
5