Je propose un topic d'entraînement au Bash pour tout les niveaux. Je suis loin (et surement c'est peu dire) d'être le meilleur avec ce langage, et nos niveaux sont différents : certains sont expert, d'autres se débrouillent, d'autres débutent et d'autres n'y connaissent rien. C'est l'occasion de progresser, d'apprendre et de partager ces connaissances.
Les règles :
On indique le numéro de l'exercice quand on poste une solution.
Les solutions doivent être postées avec ce zcode : <secret><codetype="bash"></code></secret>
On peut proposer des exercices de tout niveaux en suivant la numérotation (en éditant si-besoin) et en indiquant à peu près le niveau de difficulté (débutant, habitué, confirmé ou expert).
On peut commenter certains codes, certaines solution, etc ...
On peut poster sa solution dans un autre langage de script que la Bash, compatible Unix-likes (évitons le PHP, tolérons plutôt le Ksh, le Zsh, le Csh, le Tcsh, ... à la limite le Perl). Néanmoins il est préférable de poster une solution Bash/Sh.
Écrire un script qui demande à l'utilisateur de saisir une note et qui affiche un message en fonction de cette note :
"très bien" si la note est entre 16 et 20
"bien" lorsqu'elle est entre 14 et 16
"assez bien" si la note est entre 12 et 14
"moyen" si la note est entre 10 et 12
"insuffisant" si la note est inférieur à 10
Solution :
#!/bin/bash
echo "Entrez votre note :"
read note
if [ $note -ge 16 ]
then
echo "très bien"
elif [ $note -ge 14 ]
then
echo "bien"
elif [ $note -ge 12 ]
then
echo "assez bien"
elif [ $note -ge 10 ]
then
echo "moyen"
else
echo "insuffisant"
fi
Exercice 2 : les notes, le retour
débutant
Reprenez l'exercice 1 et faites en sorte que le programme se répète tant que l'utilisateur n'aie pas saisie une note négative ou q (pour quitter).
Le script doit calculez le nombre de notes de saisies et en faire la moyenne tout à la fin.
Solution :
#!/bin/bash
note=0
moyenne=0
i=0
until [ $note -lt 0 ]
do
echo "Entrez votre note (q pour quitter) :"
read note
if [ $note = "q" ]
then
note=-1
echo "au revoir !"
elif [ $note -ge 16 ]
then
echo "très bien"
elif [ $note -ge 14 ]
then
echo "bien"
elif [ $note -ge 12 ]
then
echo "assez bien"
elif [ $note -ge 10 ]
then
echo "moyen"
elif [ $note -ge 0 ]
then
echo "insuffisant"
else
echo "au revoir !"
fi
if [ $note -ge 0 ]
then
let moyenne=$moyenne+$note
let i=$i+1
fi
done
if [ $i -le 0 ]
then
let i=1
fi
let moyenne=$moyenne/$i
echo "La moyenne est de $moyenne ($i notes)"
Exercice 3 : les notes, encore et toujours ...
habitué
Reprenez uniquement le code de l'exercice 1. La note peut cette fois être donnée en paramètre ou bien être saisie si elle n'a pas été trouvée en paramètre. La comparaison de la note devra être faite dans une fonction "appreciation".
Solution :
#!/bin/bash
appreciation ()
{
if [ $note -ge 16 ]
then
echo "très bien"
elif [ $note -ge 14 ]
then
echo "bien"
elif [ $note -ge 12 ]
then
echo "assez bien"
elif [ $note -ge 10 ]
then
echo "moyen"
else
echo "insuffisant"
fi
}
# programma principale
clear
if [ $# -ne 0 ]
then
note=$1
else
echo "Saisir une note"
read note
fi
appreciation
Exercice 4 : TestUser
habitué
Faites un script qui vous propose le menu suivant :
Citation
1 - Vérifier l'existence d'un utilisateur
2 - Connaître l'uid d'un utilisateur
q - Quitter
L'utilisateur doit être saisis, à l'aide d'une fonction. Son existance doit être vérifiée à l'aide d'une autre fonction.
Solution :
#!/bin/bash
function pause
{
echo "Appuyez sur ENTER pour continuer"
read
}
function saisirUser
{
echo "Saisir l'utilisateur"
read util
}
function verifyUser
{
if grep "^$util:" /etc/passwd > /dev/null
then
echo "L'utilisateur existe"
else
echo "L'utilisateur n'existe pas"
fi
pause
}
rep=1
while [ $rep -eq 1 ]
do
clear
printf "menu :\n\n"
echo "1. vérifier l'existance d'un utilisateur"
echo "2. Connaitre l'uid d'un utilisateur"
echo -e "3. Quitter\n"
read choix
case $choix in
1)
saisirUser
verifyUser ;;
2)
saisirUser
id $util
pause ;;
q)
echo "Au revoir"
pause
rep=0 ;;
*)
echo "erreur de saisie ..."
pause ;;
esac
done
Exercice 5 : la calculatrice
habitué
Faire un script dans lequel deux nombres opérandes et un signe opérateur (+-*/) devront être donnés en paramètres, ou saisis en cas d'absence ... le script doit réaliser l'opération souhaitée.
Exemple :
[ ~] ./calculette.sh 7 + 4
Le résultat est : 11
Le calcul doit être fait à l'aide d'une fonction calcul.
Solution :
#!/bin/bash
function saisir
{
printf "Saisir le premier nombre, puis le signe de l'opération puis le deuxième nombre :\n\n"
read nb1
read s
read nb2
}
function calcul
{
case $s in
"+") let result=$nb1+$nb2 ;;
"-") let result=$nb1-$nb2 ;;
"*") let result=$nb1*$nb2 ;;
"/") let result=$nb1/$nb2 ;;
*)
let result=0
echo -e "Erreur de saisie !\nLe resultat faut ...";;
esac
}
calcul2 ()
{
let result=$nb1$s$nb2
}
if [ $# -eq 3 ]
then
nb1=$1 ; s=$2 ; nb2=$3
else
saisir
fi
calcul
echo "Le résultat est $result"
calcul2
echo "Calculé d'une autre façon : $result"
Exercice 6 : La factorielle
habitué
Faites un programme qui permette de calculer et d'afficher la factorielle d'un nombre donné en paramètre ou saisis en cas d'absence de paramètres.
L'exercice 6 je l'ai étudié en C la semaine dernière xD
Mouais, c'est un exercice courant, je l'ai tiré d'un vieil exo de Java ...
Exercice 7 : Les fichiers
habitué
Codez un script qui calcul le nombre de fichiers standard, de sous-répertoires, et d'exécutables d'un répertoire quelconque qui sera donné en paramètre (ou saisis en cas d'absence du paramètre).
Solution :
#!/bin/bash
j=0
k=0
l=0
if [ $# -eq 0 ]
then
echo "Saisir le répertoire"
read rep
else
rep=$1
fi
cd $rep
for i in `ls`
do
if [ -d $i ]
then
echo $i
let j=$j+1
fi
if [ -f $i ]
then
echo $i
let k=$k+1
fi
if [ -x $i ]
then
echo $i
let l=$l+1
fi
done
echo "Il y a $j répertoires, $k fichiers et $l exécutables dans $rep"
C'est un peu le même principe que la factorielle mais cette fois, l'usage de la boucle for est imposé.
Pour les utilisateurs habitués : la valeur doit être prise en paramètre (ou en saisie en cas d'absence du paramètre). Le calcul doit se faire à l'aide d'une fonction opération.
Solution 1 (débutant) :
#!/bin/bash
echo "Saisir une valeur"
read value
result=1
for (( i=0 ; i<$value ; i++ ))
do
let result=$result*$value
done
echo "$value^$value = $result"
Solution 2 (habitué) :
#!/bin/bash
operation ()
{
result=1
for (( i=0 ; i<$value ; i++ ))
do
let result=$result*$value
done
echo "$value^$value = $result"
}
if [ $# -eq 0 ]
then
echo "Saisir une valeur"
read value
else
value=$1
fi
operation
N'hésitez pas à proposer vos exercices et/ou vos solutions
Mais ça te permettrait quand même de pouvoir les reclasser du plus facile au plus dur facilement...
Le mieux ça serait limite que tu fases un tutoriel que tu updates
(En plus tu le sais, mais tu mélanges les notations...)
J'ai utilisé (et non mélangé) les deux notations pour souligner leur existences respectives
Citation : Erus_Iluvatar
un bashisme affreux comme function.
Mais vu qu'on parle de procédures en Bash ... je n'y vois pas d'inconvénients (les langages ne sont pas toujours fait pour se ressembler).
Citation : xavierm02
Mais ça te permettrait quand même de pouvoir les reclasser du plus facile au plus dur facilement...
Le mieux ça serait limite que tu fases un tutoriel que tu updates
Bof, des exos c'est pas suffisant pour faire un tuto ... et puis m@teo21 s'occupe déjà d'un tuto sur Bash (qui n'est pas encore terminé je crois). Et puis c'est juste des exos histoire de s'entraîner, pas la peine de faire beaucoup de cérémonie. L'idée c'est aussi que d'autres postes des exercices (même si j'en ai encore en réserve) ...
Par contre ce qui serait faisable, c'est de recenser les exos par des liens et les classer par niveaux de difficultés (je m'en chargerai à l'occasion ).
Sisi, dans ta calculette, tu utilise les deux. Pis bon, sinon tout tes scripts fontionnent avec dash sans ce bashisme, d'où ma remarque (un peu aigrie d'ailleurs, pardon)
C'est ce que j'ai dis ... mais lorsque tu parles de mélange, on croirait qu'il y a des confusions. Encore une fois c'est pour souligner l'existence des deux syntaxes.
Exercice 9 : Les notes, pour changer ...
Confirmé
Il s'agit ici d'un script qui va devoir exploiter les données d'un fichier de notes que vous aller crée au préalable dans le même répertoire que le script.
Ce fichier sera appelé FichierNote et devra se présenter comme ceci :
Citation : FichierNote
Dupont François 12
Durand Françoise 8
Dujardin Nicole 14
Les espaces entre les mots sont des tabulations (Nom + tab + Prénom + tab + note, après le reste n'a pas d'importance).
Le script doit afficher les lignes dans lesquelles la note est supérieur ou égal à 10. Si le fichier est vide, il doit quitter (donc ne pas boucler indéfiniment).
#!/bin/bash
cat FichierNote | while true
do
read ligne
if [ "$ligne" = "" ]
then
exit 0
else
set -- $ligne
if [ $3 -ge 10 ]
then
echo "$ligne"
fi
fi
done
Ici, vous devez avoir un script qui prend en paramètre (ou en saisie en cas d'absence du paramètre) un fichier qui contient des lignes comme ceci : Login + Tabulation + Nom + Tabulation + Prénom. Exemple :
Citation : fichier
dupontf Dupont François
fdurand Durand Françoise
nicoled Dujardin Nicole
(les espaces sont des tabulations)
Le script devra vérifier, à l'aide d'une fonction, l'existance des utilisateurs enregistrés dans le fichier. Admettons que seul Dupont François soit un utilisateur et que le fichier se nomme ~/Documents/FichierUser, le script devra s'exécuter comme ceci :
[ ~] ./NomDuScript ~/Doucuments/FichierUser
dupontf Dupont François
[ ~] ./NomDuScript
Saisissez le fichier à traiter :
~/Documents/UserFichier
Le fichier n'existe pas ...
[ ~]
Vous devinerez donc que le script doit d'abord vérifier l'existence du fichier avant de comparer son contenu au fichier /etc/passwd. Le script quitter la boucle si le fichier est vide.
Solution :
#!/bin/bash
TestUser ()
{
if grep "^$util:" /etc/passwd > /dev/null
then
echo $ligne
fi
}
if [ $# -eq 0 ]
then
echo "Chemin et nom du fichier :"
read fichier
else
fichier=$1
fi
if [ -e $fichier ]
then
cat $fichier | while true
do
read ligne
if [ "$ligne" = "" ]
then
exit
else
set -- $ligne
util=$1
TestUser
fi
done
else
echo "Le fichier $fichier n'existe pas ..."
fi
N'hésitez pas à proposer vos solutions (elles sont peut être plus optimisées d'ailleurs, mais même si ce n'est pas le cas allez y ).
un script que j'avais fait il y a assez longtemps(tout bête )... en gros c'est pratique pour faire son propre installateur de distros....
Exercice 11 : Faites votre propre version passwd
Débutant/Habitué
Contentez-vous simplement de stocker vos mots passe users/root dans des variables, ça devrait être suffisant.
UserName=BadPotato
PASSROOT1="Le ciel est bleu"
PASSROOT2="La mer est calme"
PASSUSER1="Ferme ta yeule pis rame"
PASSUSER2="ohhhhhhh yeah"
echo "Pour commencer, nous allons défénir un mot de passe pour le root et $UserName (l'user)."
echo "Commençont par le root"
while [ "$PASSROOT1" != "$PASSROOT2" ]; do
echo "Entrez le mot de passe pour root:"
read -s PASSROOT1
echo "Confirmez le mot de passe pour root:"
read -s PASSROOT2
if [ "$PASSROOT1" != "$PASSROOT2" ]; then
echo "Erreur de saisie du mot de passe. Recommencez..."
fi
done
echo "Bravo, configuront maintenant celui de l'user ( $UserName ) "
while [ "$PASSUSER1" != "$PASSUSER2" ]; do
echo "Entrez le mot de passe pour $UserName (l'user):"
read -s PASSUSER1
echo "Confirmez le mot de passe pour $UserName (l'user):"
read -s PASSUSER2
if [ "$PASSUSER1" != "$PASSUSER2" ]; then
echo "Erreur de saisie du mot de passe. Recommencez..."
fi
done
# ... une fois en chroot mettre ceci:
echo root:$PASSROOT1 | chpasswd
echo root:$PASSUSER1 | chpasswd
Alors ici, il faut coder un script qui prend en paramètre (ou en saisie en cas d'absence de paramètres) une valeur décimale et qui doit la convertir en binaire.
Vous devez travailler sur 8 bits et chaque bit devra être contenu dans une case d'un tableau monodimentionnel ... à l'a fin on affiche toutes les cases de ce tableau de sorte à avoir la valeur en binaire lisible de droite à gauche, de la valeur décimale saisie au départ.
#!/bin/bash
MaxBits=8
pow ()
{
value2=1
for (( k=1 ; k<$i ; k ++ ))
do
let value2=$value2*2
done
}
if [ $# -eq 0 ]
then
echo "Saisir une valeur décimale"
read value
else
value=$1
fi
declare -a bin
j=0
for (( i=$MaxBits ; i>=0 ; i-- ))
do
pow
if [ $value -ge $value2 ]
then
bin[j]="1"
let value=$value-$value2
else
bin[j]="0"
fi
let j=$j+1
done
printf "La valeur binaire est de : "
for (( i=0 ; i<=($MaxBits-1) ; i++ ))
do
printf ${bin[i]}
done
echo ""
Le script devra enregistrer à l'aide d'une 10 entiers dans un tableau puis les trier dans l'ordre croissant dans ce même tableau (sans passer par un autre) et enfin afficher le contenu du tableau (ordonné) sur la sortie standard.
Solution :
#!/bin/bash
SIZE=10
for (( i=0 ; i<SIZE ; i++ ))
do
printf "Saisir un entier : "
read tab[i]
done
echo -e "\n"
for (( i=0 ; i<SIZE ; i++ ))
do
for (( j=($i+1) ; j<SIZE ; j++ ))
do
if [ ${tab[j]} -le ${tab[i]} ]
then
tampon=${tab[i]}
tab[i]=${tab[j]}
tab[j]=$tampon
fi
done
done
for (( i=0 ; i<SIZE ; i++ ))
do
echo ${tab[i]}
done
Bonjour.
Je m'excuse d'écrire sur un sujet aussi vieux mais voulant faire quelques exercices sur les script bash, je suis tombé sur ce sujet. Mais le problème que j'ai est que je ne peux voir les corrections. Donc je souhaiterais savoir si cela vient de mon PC ou alors si ces corrections ne sont tout simplement plus ici.
Je vous remercie d'avance de vos réponses.
PS : Oubliez ce que je viens de dire ça marche en fait c'est à cause de ma connexion à internet j'ai un modem 56 connexant avec le pilote libre alors ça bug comme pas possible encore désolé pour la gêne occasionné.
Créer script shell qui permet en argument une liste de fichiers texte . Ce script permet de passer en majuscule le contenu de ce fichier. Les resultats seront mis dans autre fichiers qui font suivi(exp fich => fichMajus) .
Bonjour, aider moi pour réaliser ce exercice Ecrire un script shell permettant d'afficher le menu suivant : Menu l créer le fichier liste contenant les fichiers du répertoire de connexion. d demander à l'utilisateur de saisir le nom d'un répertoire. S'il existe faire un lien sur ce répertoire dans le répertoire de connexion. f rechercher le fichier dont le nom est donné comme 1er paramètre dans le repertoire /tmp. S'il existe il sera supprimé. r afficher les droits d'accés ainsi que le propiriétaire du fichier donné comme 2ème paramètre s'il existe. u rechercher si le nom d'utilisateur donné comme 3ème paramètre est définit sur le système. Si oui afficher son uid et son gid. q quitter le menu Faites tous les tests nécessaires
On te demande pas l'impossible .. Fait des recherches sur google. Pose au moins un bout de code. On va pas faire le travail à ta place.
super, je trouve ton poste sur des exercice en script bash Linux super, ca permert d'apprendre et d'avancer. Des que j'ai le temps je passerai a ton poste que je trouve tres bien.
Bonjour, aider moi pour réaliser ce exercice Ecrire un script shell permettant d'afficher le menu suivant : Menu l créer le fichier liste contenant les fichiers du répertoire de connexion. d demander à l'utilisateur de saisir le nom d'un répertoire. S'il existe faire un lien sur ce répertoire dans le répertoire de connexion. f rechercher le fichier dont le nom est donné comme 1er paramètre dans le repertoire /tmp. S'il existe il sera supprimé. r afficher les droits d'accés ainsi que le propiriétaire du fichier donné comme 2ème paramètre s'il existe. u rechercher si le nom d'utilisateur donné comme 3ème paramètre est définit sur le système. Si oui afficher son uid et son gid. q quitter le menu Faites tous les tests nécessaires
#!/bin/bash
#Affiche le nombre de lettre ou de mots dans un fichier .txt
#Vous rechercher la ligne ou se trouve le mots aussi.
read -p "entre ton chemin du fichier " fiche
read -p "choisir une lettre ou mots: " mots
for i in $mots
do
nombre=$(grep -E "$i" $fiche)
nombre2=$(grep -E "$i" $fiche | wc -L )
nombre3=$(grep "$i" $fiche | wc -l )
nombre4=$(nl $fiche | cat | grep "$i" )
done
if [ $mots ]
then
echo "trouver
$nombre2 :lettre du mots
$nombre3 :mots dans le texte
ligne : $nombre4 "
else
echo "non trouver"
fi
j'ai trouver tes script pour apprendre excellent, merci à toi, je vais travailler dessus merci.sinon voila un script que j'avais fait, vous pouvez l'améliorer encore.
ce script permet de :
Il affiche le nombre de lettre ou de mots dans un fichier .txt Il Vous recherche la ligne ou se trouve le mots aussi. Par preciser bien le nom du fichier et du chemin.
voila : ce que ca donne
entre ton chemin du fichier /home/luky/restauration.txt
choisir une lettre ou mots: airmode
trouver
55 :lettre du mots
1 :mots dans le texte
ligne : 11 airmode
- Edité par ALAIN290000 14 décembre 2015 à 23:00:43
Créez un script qui boucle en demandant une chaîne de caractères, insère cette chaîne de caractères dans un fichier donné en premier paramètre jusqu'à ce que la taille du fichier dépasse 50
je ne sais même pas pourquoi je réponds, je ne parle pas au personnes malpolies, et irrespectueuses : pas de «bonjour», pas de «s'il vous plaît», pas de «merci», aucun travail d'explication du travail à faire, aucune recherche de solution.
eh ben, pas de réponse/solution !
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Écrire un script qui demande a l'utilisateur de donner deux nombres et affiche la somme .le script doit être exécuté avec deux paramètre ,sinon il faut traiter le cas d'erreur.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique