Vous êtes sur la page 1sur 7

Université des Sciences et de la Technologie Houari Boumediene

Faculté d’Electronique et d’Informatique


Département Informatique

Master Bioinformatique Dr Bahia ZEBBANE (zebbane@gmail.com)

SYSTEME ET PROGRAMMATION DE SCRIPTS

TP2: PROGRAMMATION SHELL : CORRIGÉ

PARTIE III : PROGRAMMATION SHELL


1. Ecrivez un script Shell qui permet d’afficher le nom du script, le nombre des arguments passés, et la
liste de ces arguments s’il en existe.

#!/bin/bash
echo "Nom du programme : $0"
echo "Nombre d'arguments : $#"
if [ $# -ne 0 ]
then
echo "Liste des arguments : $@"
fi

2. Ecrivez un script Shell qui utilise une boucle for pour afficher les nombres de 3à11.

for i in $(seq 3 11) for i in {3..11} for ((i=3 ; i<=11 ; i++))


do do do
echo $i echo $i echo $i
done done done

3. Ecrivez un script shell qui utilise une boucle for pour parcourir la liste des entrées du répertoire
courant dont le nom se termine par ‘.c’ et appliquer à chacune la commande ls -l.

for i in *.c
do
ls -l $i
done

B. ZEBBANE Système et programmation de scripts M1 Bio_Info 1/7


4. Ecrivez un script shell qui utilise une structure case qui parcourt la liste des lignes du fichier
/etc/passwd et qui affiche :
- "root" si la ligne concerne root
- "Le Shell par défaut est sh" si la ligne se termine par /bin/sh
- "Le Shell par défaut est bash" si la ligne se termine par /bin/bash
- "Compte verrouillé" si la ligne se termine par /bin/nologin
- "Accès au shell interdit" si la ligne se termine par /bin/false
- "Inconnu" dans tous les autres cas

while read ligne


do
case $ligne in
root*)echo "root";;
*/bin/sh) echo "Le shell par defaut est sh" ;;
*/bin/bash) echo "Le shell par defaut est bash" ;;
*/bin/nologin) echo "Compte verrouillé" ;;
*/bin/false) echo "Acces au shell interdit" ;;
*) echo "Inconnu"
esac
done < /etc/passwd

5. Ecrivez un script shell qui permet de :


- Déclarer une variable de type tableau qui s’appelle tab et qui contient la liste suivante :
dimanche lundi mardi mercredi jeudi vendredi samedi
- Afficher le contenu du tableau tab comme suit :

dimanche : <taille>

lundi : <taille>

...

Où <taille> est la longueur de l’élément avant le signe en nombre de caractères.

tab=(dimanche lundi mardi mercredi jeudi vendredi samedi)


for i in ${tab[*]}
do
echo "$i : < ${#i} >"
done

tab=(dimanche lundi mardi mercredi jeudi vendredi samedi)


for ((i=1 ; i<=${#tab[*]} ; i++))
do
echo "${tab[$i]} : < ${#tab[$i]} "
done

B. ZEBBANE Système et programmation de scripts M1 Bio_Info 2/7


6. Utilisez une boucle while avec la commande sort dans un tube de commandes pour trier les
lignes du fichier /etc/passwd par ordre numérique croissant des UID, et afficher les lignes dont
la longueur est inférieure ou égale à 15 caractères.

while read ligne


do
if [ ${#ligne} -le 15 ]
then
echo "$ligne"
fi
done <<< $(sort -t: -kn 3 /etc/passwd)

7. Que fait la boucle suivante :


$ for a in {8..50..2}; do echo $a; done

Elle afficher les nombres de 8 à 50 avec un pas de 2

8. Utilisez une boucle for qui affiche l’alphabet en minuscules en utilisant l’intervalle a..z.

for letter in {a..z}


do
echo $letter
done

9. Avec la même syntaxe, affichez 10 fois la date à un intervalle de 2 secondes.

for letter in {1..10}


do
date
sleep 2
done

10. Ecrivez un script shell qui permet d'afficher le menu suivant à l'utilisateur :

Affiche la liste des utilisateurs connectés


Affiche la liste des processus
Afficher à l'utilisateur son UID et son GID
Le script doit boucler tant que l'utilisateur n'a pas choisi de quitter.

B. ZEBBANE Système et programmation de scripts M1 Bio_Info 3/7


#Avec la boucle select
while true
do
PS3="Votre choix: "
select reponse in 'Affiche la liste des utilisateurs connectés'\
'Affiche la liste des processus'\
'Afficher à utilisateur son UID et son GID'\
'Quitter'
do
case $REPLY in
"1") echo "La liste des utilisateurs connectés est:"; who;;
"2") echo "La liste des processus est :" ps -A;;
"3") echo "Le UID et le GID de l'utilisateur $(whoami) sont :"; id;;
"4") echo "Quitter"; exit 0;;
*) clear; break;;
esac
done
done

#Sans la boucle select


while true
do
echo "1) Affiche la liste des utilisateurs connectés"
echo "2) Affiche la liste des processus"
echo "3) Afficher utilisateur son UID et son GID"
echo "4) Quitter"
read -p "vote choix: " reponse;
case $reponse in
"1") echo "La liste des utilisateurs connectés est:"; who;;
"2") echo "La liste des processus set :" ps -A;;
"3") echo "Le UID et le GID de l'utilisateur $(whoami) sont :"; id;;
"4") echo "Quitter"; exit 0;;
esac
read -p "continuez o/n : " choix;
if [ $choix = "n" ]
then
exit 0;
fi
done

B. ZEBBANE Système et programmation de scripts M1 Bio_Info 4/7


PARTIE IV : FONCTIONS SHELL
1. Ecrivez une fonction qui permet de vérifier l'existence d'un utilisateur donné.
Solution 1 : Lire le nom de l'utilisateur dans la fonction

#Solution1
function verif_user() {
read -p "donner le nom de l'user: " user
#my_user=$(getent 'passwd' $user)
my_user=$(cut -d":" -f1 /etc/passwd | grep $user)
if [ ${#my_user} -ne 0 ]
then
echo "user $user exist"
else
echo "user $user doesn't exist"
fi
}

#Solution2
function verif_user() {
read -p "donner le nom de l'user: " user
grep "^$user:" /etc/passwd > /dev/null
if [ $? -eq 0 ]
then
echo "user $user exist"
else
echo "user $user doesn't exist"
fi
}
#Solution3
function verif_user() {
read -p "donner le nom de l'user: " user
if grep "^$user:" /etc/passwd > /dev/null
then
echo "user $user exist"
else
echo "user $user doesn't exist"
fi
}

Solution 2 : Lire le nom de l'utilisateur le programme principal et le faire passer comme paramètre
lors de l'appel de la fonction

function verif_user() {
if grep "^$1" /etc/passwd > /dev/null
then
echo "user $user exist"; return 1
else
echo "user $user doesn't exist"; return 0
fi
}

B. ZEBBANE Système et programmation de scripts M1 Bio_Info 5/7


2. Ecrivez une fonction qui permet d'afficher le UID d'un utilisateur donné.

#Solution 1
function verif_uid() {
if grep "^$1" /etc/passwd > /dev/null
then
echo "The $1's UID is $(id -u $1)"
else
echo "user $1 doesn't exist";
fi
}

#Solution 2
function verif_uid() {
uid=$(grep "^$1:" /etc/passwd | cut -d":" -f3)
if [ ${#uid} -ne 0 ]
then
echo "The $1's UID is $uid"
else
echo "user $1 doesn't exist";
fi
}

3. Un script qui propose le menu suivant :

Vérifier l'existence d'un utilisateur


Connaitre l'UID d'un utilisateur
Quitter
Solution 1 : Lire le nom de l'utilisateur dans la fonction
#Avec la boucle select
PS3="Votre choix: "
select reponse in 'Vérifier l'existence d'un utilisateur '\
'Connaitre l'UID d'un utilisateur '\
'Quitter'
do
case $REPLY in
"1") verif_user ;;
"2") if [ ${$#} -eq 0 ]; then read -p "username: " username;
fi
verif_uid $username;;
"3") echo "Quitter"; exit 0;;
esac
done

B. ZEBBANE Système et programmation de scripts M1 Bio_Info 6/7


Solution 2 : Lire le nom de l'utilisateur le programme principal et le faire passer comme paramètre
lors de l'appel de la fonction

#Avec la boucle select


PS3="Votre choix: "
select reponse in 'Vérifier l'existence d'un utilisateur '\
'Connaitre l'UID d'un utilisateur '\
'Quitter'
do
case $REPLY in
"1") read -p "donner le nom de l'user: " user
verif_user $user;;
"2") if [ ${$#} -eq 0 ]; then read -p "username: " username;
fi
verif_uid $username;;
"3") echo "Quitter"; exit 0;;
esac
done

Remarque : sans la boucle select ===>même chose que la question 10

4. Un script qui accepte des options pour réaliser les fonctions suivantes :

-e : Vérifier l'existence d'un utilisateur


-u : Connaitre l'UID d'un utilisateur

if [ $# -ne 0 ]
then
while getopts "eu" opt;
do
case $opt in
"e") read -p "username: " username; verif_user $username;;
"u") read -p "username: " username; verif_uid $username;;
esac
done
else
echo "An option is needed try --help--"
echo -e "-e: check user \n -u: diplay user uid";
fi

B. ZEBBANE Système et programmation de scripts M1 Bio_Info 7/7

Vous aimerez peut-être aussi