Exercice 10 :
Recherchez si le fichier des mots de passe contient un utilisateur qui s’appelle « root ». Ecrire un
script shell user_exist.sh qui utilise cette commande en prenant le nom d’utilisateur en
paramètre et qui affiche un message indiquant si l’utilisateur existe ou
. Le script renvoie la
valeur 0 si l’utilisateur existe, sinon il renvoie 1.
- Spoiler:
[code]
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Usage : $0 "
exit 2
fi
if [ `cat /etc/passwd | egrep "^$1" | wc -l` -gt 0 ]
then
echo "L'utilisateur recherché a un compte sur la machine"
exit 0
else
echo "L'utilisateur recherché n'a pas de compte sur la machine"
exit 1
fi
[code]
Exercice 11 :
Ecrire un script shell msg_err.sh qui écrit un message vers la sortie standard d’erreur. Vérifier
que votre programme fait bien ce qu’il faut.
- Spoiler:
[code]
#!/bin/bash
echo "$@" 1>&2[code]
Exercice 12 :
Ecrire un script shell nospace.sh qui prend exactement un argument, qui vérifie que cet
argument est un fichier ou un répertoire, et qui, dans le cas où le nom du fichier ou du répertoire
contient au moins un espace, renomme ce fichier ou ce répertoire en remplaçant tous les
espaces par le caractère « _ » (underscore).
Quand le script est appelé sur un fichier ou un répertoire dont le nom ne contient pas d’espace, il
ne fait rien.
- Spoiler:
[code]
#!/bin/bash
#Teste le nombre d'arguments du script
if [ $# -ne 1 ]
then
echo "Usage : $0
"
exit 1
fi
#Teste que le fichier/répertoire donné en argument existe
if [ ! -f "$1" ] && [ ! -d "$1" ]
then
echo "Fichier ou répertoire trouvé"
exit 2
fi
#Nom du fichier/répertoire à renommer
SOURCE=$1
#Séparer SOURCE et traiter chaque mots issu de cette décomposition
export IFS=$' \t\n'
set $SOURCE
CIBLE="$1"
shift
while [ $# -gt 0 ]
do
CIBLE="${CIBLE}_$1"
shift
done
#Renommer le fichier en remplacant les espaces par des underscores
mv "$SOURCE" "$CIBLE"
exit 0
[code]
Exercice 13 :
Ecrire un script shell words.sh qui prend un argument (un nom de fichier) et qui affiche chaque
mot du fichier, à raison d’un mot par ligne, chaque mot étant suivi par son nombre
d’occurrences dans le fichier. Les mots doivent apparaitre triés alphabétiquement. Par exemple,
si le fichier untexte.txt contient les lignes suivantes :
carotte, patate... carotte, poireau !
haricot; poireau; carotte; patate...
patate+patate=patate
Alors on a :
$ ./words.sh untexte.txt
Nombre de mots dans ce texte : 11
Nombre de mots différents dans ce texte : 4
carotte 3
haricot 1
patate 5
poireau 2
Afin de vous aider, voici les étapes à suivre pour décomposer le problème et arriver à la
résoudre :
1. On testera déjà la manière d’obtenir la liste des mots qui sont contenus dans le fichier. On
utilisera pour cela intensivement les pipes pour combiner le résultat de chacune des
commandes qui réaliseront successivement les étapes suivantes :
a. lire le contenu de untexte.txt ;
b. remplacer les ponctuations par des retours à la ligne ;
c. supprimer les espaces et les tabulations ;
d. ne retenir que les lignes
vides ;
e. trier la liste de mots obtenus ;
f. ne retenir qu’un seul de ces mots.
2. On stockera le résultat de la liste complète des mots (sans supprimer les doublons) dans
une variable « list ».
4
3. On calculera et affichera le nombre total de mots dans le texte ainsi que le nombre unique
de mots.
4. On fera une boucle qui parcourt cette liste de mots pour afficher et compter l’occurrence
de chacun de ces mots. Pour vous aider, vous devrez stocker le mot précédent (initialisé à
""). Si celui-ci est différent du mot courant alors on affichera le résultat et on initialisera
la variable mot précédent et la variable occurrence aux bonnes valeurs, sinon, on
incrémente juste l’occurrence.
Et si on avait souhaité afficher le nombre d’occurrences de chacun des mots avant le mot,
comment auriez-vous procéder ? Quel programme cela aurait-il donné ? (pensez à lire la page de
manuel de la commande « uniq »).
- Spoiler:
[code]
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Usage : $0 "
exit 1
fi
LIST=`tr -s [:space:][:punct:] "\n" < $1 | egrep .+ | sort`
TOTALWORDS=`echo "$LIST" | wc -w`
echo "Nombre de mots dans ce texte : $TOTALWORDS"
if [ $TOTALWORDS -eq 0 ]
then
exit 0
fi
DIFFWORDS=1
PREV=" "
for MOT in $LIST
do
if [ "$MOT" != "$PREV" ]
then
if [ "$PREV" != " " ]
then
DIFFWORDS=$[ $DIFFWORDS + 1 ]
fi
PREV="$MOT"
fi
done
echo "Nombre de mots différents dans ce texte : $DIFFWORDS"
PREV=" "
for MOT in $LIST
do
if [ "$MOT" == "$PREV" ]
then
IDWORDS=$[ $IDWORDS + 1 ]
else
if [ "$PREV" != " " ]
then
echo "$PREV $IDWORDS"
fi
IDWORDS=1
PREV="$MOT"
fi
done
echo "$PREV $IDWORDS"
exit 0
[code]
Exercice 14 :
On se propose de classer les photos numériques éparpillées dans différents répertoires, vous
appartenant, d’un ordinateur Unix.
Vous avez remarqué les détails suivants :
- les noms des fichiers, qui contiennent les photos, sont écrits en majuscules et sont de la
forme « XYZ0123.JPG » avec « XYZ » un identifiant d’une marque d’appareil photo (par
exemple, « DRC » pour les appareils de la marque Rony) et « 0123 » un numéro de série ;
- les droits d’accès aux fichiers sont de la forme rwxr-xr-x et leurs noms s’affichent donc
en vert.
Ecrire le script shell que l’on appelle avec XYZ et la marque de l’appareil photo sur la ligne de
commande. Par exemple :
$ ./mon_script.sh DRC Rony
Ce script shell déplace tous les fichiers dont le nom commence par XYZ et se termine par « .JPG »
vers le répertoire (à créer) qui porte le nom de la marque de l’appareil photo. Il supprime le
droit x pour tous les types d’utilisateurs pour que les noms de fichiers n’apparaissent plus en
vert. Il transforme l’extension des noms de fichiers en « .jpg » (minuscules) pour les noms
s’affichent en magenta.
Le script vérifie le nombre d’arguments de la ligne de commande et se termine en affichant un
message d’erreur si le nombre ne correspond pas. Il vérifie également si le répertoire qui porte
le nom de la marque de l’appareil photo existe déjà et, dans ce cas, il ne le crée pas.
Le script shell doit pouvoir être démarré à partir de n’importe quel répertoire.
- Spoiler:
[code]
#!/bin/bash
#Vérification du nombre d'arguments de la ligne de commande
if [ $# -ne 2 ]
then
echo "Usage : $0
"
exit 1
fi
#Sauvegarde du répertoire courant
CUR=`pwd`
#Vérification de l'existence du répertoire cible et création
#de ce dernier s'il n'existe pas
if [ ! -e "$2" ]
then
mkdir "$2"
if [ $? -ne 0 ]
then
echo "Création du répertoire $2 impossible"
exit 2
fi
else
cd "$2"
if [ $? -ne 0 ]
then
echo "Impossible d'accéder à $2"
exit 3
fi
cd "$CUR"
fi
#Retrait du droit d'exécution et déplacement dans le répertoire
#cible de tous les fichiers concernés
for FILE in $1[0-9][0-9][0-9][0-9].JPG
do
chmod a-x "$FILE"
mv "$FILE" "$2"
done
#Déplacement dans le répertoire cible
cd "$2"
#Mise en minuscules de l'extension des fichiers s'y trouvant
for FILE in *.JPG
do
mv "$FILE" "${FILE%.JPG}.jpg"
done
#Retour dans le répertoire parent (cd .. pourrait suffire)
cd "$CUR"
#Sortie du script avec un code de retour significatif
exit 0
[code]