j'ai écrit une quarantaine d'exercices de scripts Bash. Je me suis dis que ça pourrait intéresser les gens. Bien sûr je donne une proposition de solution avec chaque sujet.
Les scripts portent l'extension .sh pour les reconnaître. Il s'agit d'une simple convention.
La première ligne de vos scripts sera:
#!/bin/bash
Pour écrire des commentaires, placez un # en début de ligne ou à la suite d'une commande.
Pour pouvoir exécuter vos scripts, mettez dessus les droits d’exécution avec la commande
chmod +x script.sh
Faites ensuite ./script.sh pour lancer le script script.sh si vous êtes dans le dossier contenant le script. Autrement il faut indiquer un chemin absolu:
/home/nom_utilisateur/bootcamp_bash/script.sh
Vous pouvez également ajouter le dossier contenant les exercices au PATH pour pouvoir éxécuter vos scripts à partir de n'importe quel endroit:
Écrire un script qui affiche la date au format hh:mm:ss jj/mm/aa
Exemple :
./date.sh
15:44:57 19/11/15
Exercice 2 : melimelo.sh
Écrire un script qui affiche l'emplacement du fichier tutor. Vous aurez peut-être besoin de passer en root temporairement.
Si le fichier n'est pas présent sur votre système, vous pouvez travailler sur n'importe quel fichier de plus de 26 lignes.
A l'aide d'une unique ligne de commandes bash, affichez les 26 dernières lignes du fichier tutor, de la dernière à la première, écrites à l'envers, en supprimant les lignes vides, précédé du numéro de la ligne (la dernière ligne aura le numéro 20), le tout trié dans l'ordre alphabétique.
Exercice 3 : nb_lignes.sh
Complétez la ligne de commandes précédente afin qu'elle renvoie maintenant le nombre de ligne qu'elle affichait à l'écran précédemment.
Exemple :
./nb_lignes.sh
20
Exercice 4 : groupes.sh
Affichez les trois premiers groupes auxquelles vous appartenez séparés par des points virgules, et terminé par un point.
Exemple :
./groupes.sh
matthieu;adm;cdrom.
Exercice 5 : sort.sh
Écrire un script qui affiche ses paramètres dans l'ordre alphabétique suivi d'un retour à la ligne.
Exemple :
./sort.sh un deux trois quatre cinq
cinqs deux quatre trois un
Exemple 2 :
./sort.sh "un deux trois quatre cinq"
cinqs deux quatre trois un
Exercice 6 : users.sh
Écrire un script qui affiche dans l'ordre alphabétique la liste des utilisateurs dont des processus sont en cours d'exécution sur le système.
Écrire un script qui renvoie le nombre de paramètres avec lesquels il a été appelé.
Exemple :
./params1.sh un deux trois
J'ai été appelé avec 3 arguments.
Exercice 2 : plus_grand_rep.sh
Usage : plus_grand_rep dir1 dir2
Affiche le répertoire qui possède le plus de références entre dir1 et dir2.
Exercice 3 : seq1.sh
Usage : seq1.sh int
Écrivez un script qui affiche les entiers de 1 à int.
Exemple :
./seq1.sh 4
1
2
3
4
Exercice 4 : home.sh
Écrire un script qui demande à l'utilisateur le chemin absolu de son home. L'utilisateur à 5 secondes pour entrer le chemin, sinon le script affiche "Trop tard !"
Exemple :
Chemin absolu de votre home : /home/matthieu
Votre home se trouve ici : /home/matthieu
Exemple 2 :
Chemin absolu de votre home :
Trop tard !
Exercice 5 : seq2.sh
Usage : seq2.sh last Usage : seq2.sh first last Usage : seq2.sh first increment last
Écrivez un script qui imite le comportement de la commande seq.
Exemple :
./seq2.sh 2 3 10
2
5
8
Exercice 6 : params2.sh
Écrire un script qui affiche son nom, puis le chemin par lequel il a été appelé, puis tout ses arguments un à un.
Exemple :
./params2.sh un deux trois quatre cinqs six sept huit neuf dix onze
nom: params.sh
chemin: .
argument 1 : un
argument 2 : deux
argument 3 : trois
argument 4 : quatre
argument 5 : cinqs
argument 6 : six
argument 7 : sept
argument 8 : huit
argument 9 : neuf
argument 10 : dix
argument 11 : onze
Exercice 7 : max1.sh
Usage: max1.sh int1 int2
Écrire un script qui prend deux entiers en arguments et qui affiche le plus grand des deux.
Exemple :
./max1.sh 3 3
3
Exemple 2 :
./max1.sh 8 4
8
Exercice 8 : max2.sh
Usage: max2.sh int1 int2 int3
Écrire un script qui prend trois paramètres et qui affiche le plus grand des trois.
Exercice 9 : nombre_mystere.sh
Il faut deviner le nombre mystère. Celui-ci est compris entre 1 et 1000. Le joueur a dix essais.
Exemple :
Entrez un nombre entre 1 et 1000 : 500
Le nombre est plus grand.
Il vous reste 9 essais.
Entrez un nombre entre 1 et 1000 : 750
Le nombre est plus petit.
ntrez un nombre entre 1 et 1000 : 565
Vous avez gagné !
Exemple 2 :
Entrez un nombre entre 1 et 1000 : 500
...
Entrez un nombre entre 1 et 1000 : 10
Il vous reste 0 essais.
Vous avez perdu ! Le nombre mystère était 9.
Exercice 10 : max3.sh
Usage: max3.sh int1 ... intn
Écrire un script qui affiche le plus grand de tous ses paramètres.
A la place du 26 novembre 15:45 vous aurez la date d'exécution du script. Le reste doit être identique.
Exercice 13 : ls_path.sh
Affiche le contenu de tous les répertoires qui apparaissent dans le chemin absolue du répertoire courant.
./ls_path
/home/matthieu
bootcamp_bash Desktop Documents Download Music Pictures Public Templates Videos
/home
matthieu
/
bin cdrom etc ...
boot dev home ...
#!/bin/bash
echo "J'ai été appelé avec $# arguments."
Exercice 2 : plus_grand_rep.sh
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Usage : `basename $0` dir1 dir2"
else
size1=$(ls "$1" | wc -w)
size2=$(ls "$2" | wc -w)
if [ $size1 -gt $size2 ]; then
echo "Le répertoire contenant le plus de référence est $1."
elif [ $size2 -gt $size1 ]; then
echo "Le répertoire contenant le plus de référence est $2."
else
echo "Les deux répertoires contiennent autant de références."
fi
fi
Exercice 3 : seq1.sh
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage : `basename $0` int"
else
i=1
while [ $i -le $1 ]; do
echo $i
let i="$i + 1"
done
fi
Exercice 4 : home.sh
#!/bin/bash
read -t 5 -p "Chemin absolu de votre home : " home_path
if [ -z "$home_path" ]; then
echo -e "\nTrop tard !"
else
echo "Votre home se trouve ici : $home_path"
fi
Exercice 5 : seq2.sh
#!/bin/bash
if [ $# -eq 1 ]; then
i=1
while [ $i -le $1 ]; do
echo $i
let i="$i + 1"
done
elif [ $# -eq 2 ]; then
i=$1
while [ $i -le $2 ]; do
echo $i
let i="$i + 1"
done
elif [ $# -eq 3 ]; then
i=$1
while [ $i -le $3 ]; do
echo $i
let i="$i + $2"
done
else
echo "Usage : `basename $0` last"
echo "Usage : `basename $0` first last"
echo "Usage : `basename $0` first increment last"
fi
Exercice 6 : params2.sh
#!/bin/bash
echo "nom : `basename $0`"
echo "chemin : `dirname $0`"
count=1
while [ $# -gt 0 ]; do
echo "argument $count : $1"
let count=$count+1
shift
done
Exercice 7 : max1.sh
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Usage : `basename $0` int1 int2"
else
if [ $1 -gt $2 ]; then
echo $1
else
echo $2
fi
fi
Exercice 8 : max2.sh
#!/bin/bash
if [ $# -ne 3 ]; then
echo "Usage : `basename $0` int1 int2 int3"
else
if [ $1 -ge $2 ] && [ $1 -gt $3 ]; then
echo $1
elif [ $2 -gt $1 ] && [ $2 -gt $3 ]; then
echo $2
else [ $3 -eq $3 ]
echo $3
fi
fi
Exercice 9 : nombre_mystere.sh
let nb_myst="$RANDOM % 1000 + 1"
nb_try=10
while [ $nb_try -ge 1 ]
do
read -p "Entrez un nombre entre 1 et 1000 : " try
if [ $try -gt $nb_myst ]; then
echo "Le nombre est plus petit."
elif [ $try -lt $nb_myst ]; then
echo "Le nombre est plus grand."
else
echo "Vous avez gagné !"
exit 0
fi
let nb_try="$nb_try - 1"
echo "Il vous reste $nb_try essais."
done
echo "Vous avez perdu ! Le nombre mystère était $nb_myst."
Exercice 10 : max3.sh
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage : `basename $0` int1 ... intn"
else
max=0
for i in $*; do
if [ $i -gt $max ]; then
max=$i
fi
done
echo $max
fi
Exercice 11 : cat.sh
#!/bin/bash
if [ -z $1 ]; then
while read message
do
echo "$message"
done
else
while read message
do
echo "$message"
done < "$1"
fi
Écrire un script qui affiche le dernier argument avec lequel il est invoqué.
Exemple :
./last_arg.sh un deux trois
trois
Exercice 2 : case1.sh
Usage : case1.sh int
Écrire un script qui affiche "Mauvais" si int est entre 0 et 4, "Passable" entre 5 et 9, "Bien" entre 10 et 14, "Très bien" entre 15 et 19, "Parfait" si int vaut 20, et "WTF?!" autrement.
Vous ne pouvez pas utiliser de if.
Exercice 3 : verif_path.sh
Usage : verif_path.sh path
path est un chemin absolu. Le script va vérifier un à un l'existence des dossiers et s'arrêter au premier fichier qui n'existe pas. Dans tout les cas il affiche la racine.
Écrire un script qui crée une copie de chaque fichier présent dans le répertoire courant suivi du préfixe .bak. Les fichiers déjà sauvegardés seront ignorés. Le script indique le nombre de fichiers sauvegardés à la fin.
Écrire un script d'une seule ligne qui affiche autant de 1 qu'indique l'entier passer en argument. La première ligne du script, le sha-bang, ne compte pas.
Attention, il s'agit bien d'une seule ligne de commandes. Vous ne pouvez pas utilisez de point-virgule pour mettre plusieurs lignes de commandes à la suite.
Exemple :
./the_one.sh
Usage : the_one.sh int
Exemple 2 :
./the_one.sh 5
1 1 1 1 1
Exercice 6 : case2.sh
Usage : case2.sh arg
Écrire un script qui dit si la chaîne passée en argument contient des voyelles, des consonnes ou des chiffres.
Écrire un script qui dessine un carré à l'écran de la taille passé en argument.
Exemple :
./draw1.sh 1
*
Exemple 2 :
./draw1.sh 3
***
***
***
Exercice 2 : draw2.sh
Usage : draw2.sh int
Écrire un script qui dessine un triangle à l'écran de la taille passé en argument.
Exemple :
./draw2.sh 1
*
Exemple 2 :
./draw2.sh 3
*
**
***
Exercice 3 : draw3.sh
Usage : draw3.sh int
Écrire un script qui dessine un triangle inversé par rapport à l'exercice précédent, de la taille passé en argument.
Exemple :
./draw3.sh 1
*
Exemple 2 :
./draw3.sh 3
***
**
*
Exercice 4 : draw4.sh
Usage : draw4.sh int
Écrire un script qui dessine la figure donnée en exemple à l'écran de la taille passé en argument.
Exemple :
./draw4.sh 1
*
Exemple 2 :
./draw4.sh 3
***
***
***
Exercice 5 : draw5.sh
Usage : draw5.sh int
Écrire un script qui dessine une pyramide à l'écran de la taille passé en argument.
Exemple :
./draw5.sh 1
*
Exemple 2 :
./draw5.sh 3
*
***
*****
Exercice 6 : draw6.sh
Usage : draw6.sh int
Écrire un script qui dessine un losange à l'écran de la taille passé en argument.
Exemple :
./draw6.sh 1
*
Exemple 2 :
./draw6.sh 3
*
***
*****
***
*
Exercice 7 : draw_shell.sh
Écrire un script qui affiche un prompt à l'écran. L'utilisateur rentre le nom d'une figure qui est alors dessinée à l'écran. L'utilisateur peut entre la commande 'quitter' pour quitter. Tout autre entrée provoque l'affichage du message suivant :
> qlkhsgg
Commande invalide
Les commandes valides sont : carre, triangle, triangle_inv, special, pyramide, losange et quitter
Vous ferez appel au scripts écris précédemment pour le dessin des figures.
Exemple 2 :
./draw_shell.sh 7777
>
Commande invalide
Les commandes valides sont : carre, triangle, triangle_inv, special, pyramide, losange et quitter
> carre
Usage : draw1.sh int
> carre 3 666
***
***
***
> quitter
Exercice 8 : draw_shell2.sh
Réécrire le script précédent à l'aide d'une boucle select.
Exemple :
./draw_shell2.sh gfiuyogohuyg
1) quitter 4) triangle inverse 7) losange
2) carre 5) special
3) triangle 6) pyramide
# ?
1) quitter 4) triangle inverse 7) losange
2) carre 5) special
3) triangle 6) pyramide
# ? 2
Taille de la figure ? Gfiuyogohuyg
# ? 3
Taille de la figure ? 3
*
**
***
# ? 1
Écrire un script qui prends une chaîne de caractère en argument et l'affiche à l'écran. Si l'offset est spécifié en deuxième argument, le script affiche la chaîne de caractère à partir de l'offset. Si la longueur est spécifiée en troisième argument, le script affiche length caractère à partir de l'offset.
Ecrire un script qui compte le nombre de mot de longueur length dans le fichier file. Si la longueur n'est pas indiquée, le message "Default length : 4" est affiché et une longueur de 4 est utilisée.
Ecrire un script qui compte le nombre de ligne de longueur length dans le fichier file. Si la longueur n'est pas indiquée, le message "Default length : 4" est affiché et une longueur de 4 est utilisée.
Ecrire un script qui crée dans le répertoire courant 1000 fichiers ayant l'extension .ico et qui pour tous les fichiers ayant l'extension .ico du répertoire courant fait une copie du fichier avec l'extension .bak (en plus de l'extension .ico) et crée un fichier de même nom avec l'extension .png à la place de l'extension .ico.
Exemple :
ls
favicon.ico
./icotopng.sh
ls
favicon.ico.bak favicon.png aleatoire1.ico.bak aleatoire1.png aleatoire2.ico.bak aleatoire2.png ...
Ecrire un script qui, si son deuxième argument vaut 'pack' ajoute un point au nom de tous les fichiers du répertoire courant (y compris les fichiers cachés) et les ajoutes ensuite à une archive backup.tar. Si le troisième argument vaut 'clean', tous les fichiers sont effacés (sauf le script et l'archive).
Si son deuxième arguement vaut 'unpack', le script restaure tous les fichiers avec leur nom initial à partir de l'archive backup. Si le troisième argument vaut 'clean', l'archive supprime l'archive après en avoir extrait le contenu.
Exemple :
ls -a
. .. backup2.sh .file file
./backup2.sh archi pack clean
.file
file
2 fichier(s) sauvegardé(s) dans archi.tar
ls -a
. .. archi.tar backup2.sh
./backup2.sh archi unpack
tar: archi: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
unpack failed
./backup2.sh archi.tar unpack clean
.file
file
2 fichier(s) restauré(s).
Archive "archi.tar" supprimée.
ls -a
. .. backup2.sh .file file
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
Je ferme ce sujet. En cas de désaccord, me contacter par MP.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
7NB