Script Shell
Exercice 2 :
#!/bin/sh
if [ $# -ne 1 ]; then // si le nombre d’argument non égal à 1
echo "Fournir un nom en parametre" // afficher message
exit 1 // false
fi // condition fermé
if [ -d "$1" ]; then // si l’argument est un répertoire passé en premier argument . (-d : directory)
exit 0 //true
else //si nn
"$0" `dirname "$1"` // le chemin de répertoire passé en premier argument
mkdir "$1"
fi
----- Ce programme crée le répertoire fourni en argument, et au besoin tous
les sur-répertoires intermédiaires nécessaires.
Exercice 2 – La boucle while
Écrire un programme shell qui affiche les arguments du programme, dans
l'ordre d'apparition (1er argument en premier). Si le programme n'a aucun
argument, afficher « sans argument ».
#!/bin/sh
if [ $# -eq 0 ]; then //si le nombre d’argument=zéro (eq= égale)
echo "sans argument" //afficher message
exit 0 //true
fi while [ $# -gt 0 ]; do //si le nombre d’argument et supérieur à zero (gt > « supérieur »)
echo $1 //afficher le nombre d’argument actuelle
shift //supprime l’ancien argument et met en place le nouveau
done
Exercice 3 – La commande read
Écrire un programme shell qui affiche ligne par ligne le contenu d'un fichier
dont le nom est fourni en paramètre.
#!/bin/sh
exec < $1 // rediriger l’entrée standard vers le fichier dans le nom et passé en premier parametre
while read ligne ; do // boucle +read = lie chaque ligne de l’entrée
echo ">$ligne" // afficher chaque ligne précedé par >
done // Fin programme
Exercice 4 – La boucle for
Écrire un programme shell qui affiche tous les sous-répertoires du répertoire
courant, en utilisant une boucle.
#!/bin/sh
for rep in *; do //# pour chaque fichier "rep" du repertoire courant (* : all)
if [ -d "$rep" ]; then // # si rep est un repertoire
echo $rep //# affiche rep
fi
done
Exercice 5 – Opérateurs sur les chaînes
Que fait le programme shell suivant (remplacez les '...' par le texte adéquat) ?
#!/bin/sh
w=`who | grep $1`
if [ -z "$w" ]; then echo "$1 n'est pas ..."; fi
Ce programme détermine si l'utilisateur dont le nom est donné comme argument est connecté.
#!/bin/sh
w=`who | grep $1` //who= obtenir la liste des utilisateurs connécté // w= socké dans variable w
if [ -z "$w" ]; then // vérifier la variable w si vide (-z : vérifier si une chaine de caractére est vide )
echo "$1 n'est pas connecté"; //afficher message
fi //fin programme
Exercice 6 – Les conditionnelles imbriquées Solution :
#!/bin/sh
if [ $# -eq 2 ]; then // # si le nombre d'arguments est égal à 2 :
rep="." //# variable rep vaut le repertoire courant = "."
droit=$1 //# variable droit vaut le premier argument
$1 ext=$2 // variable ext vaut le deuxieme argument $2
elif [ $# -eq 3 ]; then //# si le nombre d'arguments est égal à 3 :
rep=$1 // variable rep vaut le premier argument
$1 droit=$2 // variable droit vaut le deuxieme argument $2
ext=$3 // variable ext vaut le troisieme argument $3
else
echo "erreur : donnez 2 ou 3 arguments" 1>&2
exit 1
fi
for fich in "${rep}"/*"${ext}"; do //pour chaque fichier "fich" dans rep/*ext:
chmod g$droit "$fich" // changer le droit du groupe "g" sur "fich"
echo $fich
done
Exercice 7 – L'instruction case
Écrire un programme shell qui efface un fichier après avoir demandé confirmation à
l'utilisateur. Le programme doit recevoir en paramètre le ou les noms du/des fichier(s) à effacer.
Pour chaque fichier, il demande alors à l'utilisateur : « Voulez-vous réellement effacer le fichier xxx
? ». Si la réponse est oui, le programme affiche « suppression confirmée », et efface le fichier. Si la
réponse est non le programme affiche « suppression abandonnée ». Dans les autres cas, le
programme affiche « réponse invalide » et repose la question à l'utilisateur.
#!/bin/sh
while [ $# -ne 0 ]; do // tant que le nombre d’arguments non égale 0
fich=$1; shift // donné le paramétre 1 à la variable fich
repeat=1 //variable repeat initialiser 1 « compteur »
while [ $repeat -eq 1 ]; do // tant que la valeur egale à 1
echo "Voulez-vous reellement effacer le fichier \"$fich\" ?" //Message demande
read reponse //scanf « ecrire »
case "$reponse" //vérifier la réponse
in [Oo][Uu][Ii]) // accepter tte caractères soit majuscule /miniscule
rm "$fich"// remove fichier
echo "suppression confirmée" //Message confirmation
repeat=0 ;; //compteur=0
[Nn][Oo][Nn]) // tte caractères soit majuscule /miniscule
echo "suppression abondonnée" // afficher message d’abandonnement
repeat=0 ;; *) // compteur=0
echo "reponse invalide" ;; //afficher message
esac // fermer case
done // fermer 1er while
done //fermer 2 eme while
Exercice 8 – La commande basename
On voudrait écrire un script permettant de facilement changer de façon
systématique l'extension d'une série de fichiers. On souhaite par exemple
renommer tous les fichiers .htm du répertoire courant en .html La syntaxe de
notre script rename serait alors la suivante : rename .htm .html On vérifiera
que le nombre d'arguments reçu est correct, que toutes les opérations sont
licites et correctement effectuées.
#!/bin/sh
if [ $# -ne 2 ]; then // si nbr argument non égale 2
echo "erreur : donnez 2 arguments." 1>&2 // afficher message
exit 1 //false
fi
vieux=$1 // stocker vieux dans parametre 1
nouveau=$2 // stocker nouveau dans parametre 2
for fich in *"${vieux}"; do // (fich : nom fichier / vieux : variable stocké dans chaine)
base=`basename "$fich" "$vieux"` //extrcation du nom de fichier et le stocker dans base
mv "$fich" "$base$nouveau" // renommer le fichier
if [ $? -ne 0 ]; then // vérifier code sortie si non égale à zéro échouer
echo "je ne peux pas renommer \"$fich\" en \"$base$nouveau\"" 1>&2 //message échouer
fi
done
Exercice 9 – Guillemets, quotes ou back quotes ?
Écrire un programme shell qui commence par afficher « Entrer le nom d'un répertoire : »
puis lit le nom (relatif ou absolu) d'un répertoire (commande read). Le programme affichera
ensuite le texte « Le répertoire xxx contient les fichiers suivants : » suivi de la liste des
fichiers contenus dans le répertoire.
1) Ecrire une première version dans laquelle xxx est le nom du répertoire reçu en argument.
2) Ecrire une seconde version dans laquelle xxx correspond au chemin absolu du répertoire
entré par l'utilisateur, même si celui-ci est donné en relatif. On suppose toutefois que le
répertoire donné en paramètre se trouve dans le répertoire courant (inutile d'effectuer une
recherche dans toute l'arborescence).
Le script devra en plus afficher un message d'erreur adéquat dans les cas suivants :
• si le script n'est pas appelé avec le bon nombre d'arguments,
• si le nom entré par l'utilisateur n'est pas un répertoire,
• si c'est un répertoire non lisible.
1) #!/bin/sh
echo "Entrer le nom d'un répertoire : "
read dir
echo "Le répertoire $dir contient les fichiers suivants :"
ls "$dir"