Vous êtes sur la page 1sur 7

Système d’exploitation

INSA Hauts-de-France
2A SHPI
TP3: introduction à la programmation Shell

Outils :
Pour réaliser ce TD, vous aurez besoin d’un terminal de n’importe quelle distribution Gnu/Linux.
Il est préférable d’avoir une distribution Gnu/Linux installée sur votre PC, en natif (en dual boot si vous êtes sur
Windows) ou sous forme de machine virtuelle (solution plus sûre). Il existe également des solutions de shell en
ligne : https://cocalc.com/doc/terminal.html. Il est recommandé de créer vôtre compte afin de sauvegarder le
travail réalisé.

Rendus :
Tous les scripts sont à rendre sur moodle dans une archive zip.

Terminal Linux :
Un terminal est un outil performant permettant d’exécuter des commandes. Ces commandes accomplissent toutes
les tâches que l’on peut faire habituellement avec une interface graphique (bureau et fenêtre) ; souvent en mieux.
Le commandes peuvent être lancées d’une manière interactive (lancer une commande, voir le résultat, puis lancer
une deuxième commande, …). Elles peuvent aussi être regroupées dans un seul fichier appelé script (comme en
Python) qui va être exécuté par un interpréteur : sh, bash, csh, zsh, etc.
Pour la réalisation des exercices de cette fiche, nous allons utiliser l’interpréteur sh qui est l’interpréteur par défaut
de toutes les distributions Gnu/Linux.

Fichiers et répertoires:
La commande ls permet de lister tous les fichiers et répertoires existants dans le répertoire de travail (répertoire
courant).
A) Dans le terminal shell, lancez la commande suivante :
$ ls
Observez bien le résultat obtenu !
B) Maintenant lancez la commande suivante :
$ touch fichier1.txt
C) Relancez la commande :
$ ls
Observez le résultat maintenant et comparez le avec le résultat du premier ls.
1. Y’a t-il une différence ? Si oui, laquelle ?
2. Quelle est donc le rôle de la commande touch ?
D) Lancez la commande :
$ rm fichier1.txt
E) Relancez la commande :
$ ls
Observez le résultat maintenant et comparez le avec le résultat du précédent ls de (commande C).
3. Y’a t-il une différence ? Si oui, laquelle ?
4. Quelle est donc le rôle de la commande rm ?
F) Lancez la commande :
$ mkdir mydir1
G) Relancez la commande :
$ ls
Observez le résultat maintenant et comparez le avec le résultat du précédent ls de (commande E).
5. Y’a t-il une différence ? Si oui, laquelle ?
H) Lancez la commande :
$ rm mydir1
6. Comment interpréteriez-vous le résultat obtenu ?
7. Quelle est donc le rôle de la commande mkdir?
8. En déduire la différence entre touch et mkdir.
I) Maintenant lancez l’ensemble des commandes suivantes, l’une après l’autre, et observez les résultats
intermédiaires s’il y’en aura :
$ pwd
$ mkdir mydir2
$ cd mydir2
$ pwd
$ cd ../
$ pwd
$ rmdir mydir2
$ ls
9. Quelle est le rôle de la commande pwd ?
10. Interprétez la commande cd mydir2 et la commande cd ../?
11. Quelle est le rôle exacte de la commande rmdir ?
J) Maintenant lancez la commande ls, relancez la commande B en remplaçant fichier1.txt par .fichier1.txt puis
relancez la commande ls. Y’a t-il une différence entre les résultats des deux ls?
Lancez la commande ls avec l’option -a (ls -a) et notez le résultat.
12. Quelle est donc le rôle du point qui précède le fichier1.txt?
13. Quelle est le rôle de l’option -a de la commande ls?
14. Testez la commande ls avec les option -l puis -t, puis avec les trois options ensemble (ls -alt) et donner le
rôle de chaque option.
K) Créez quatre fichiers : file1.txt, file2.txt, file3.c, et file4.py. Affichez le contenu du répertoire courant puis
lancez les commandes :
$ rm *.txt
15. Ré-affichez le contenu du répertoire et déduire la signification du ‘*.txt’ ?
16. Donnez la commande qui permet de supprimer tous les fichiers dont le nom commence par ‘monfichier’
et les fichier dont le nom se termine par ‘.log’.
17. Donnez les commandes permettant de tester votre proposition (création, affichage du contenu,
suppression, …).
L) Maintenant que vous avez compris les concepts des commandes, vous pouvez manipuler les fichiers et les
répertoires à votre guise. Donnez les commandes qui permettes de :
18. Créer 3 répertoires (mkdir) avec les noms : my_1_dir, my_2_dir, et my_3_dir
19. Vous placer dans my_1_dir
20. Créer trois fichier avec l’extension .py, deux fichier avec l’extension .sh
21. Vous placer dans my_2_dir sans revenir au répertoire père (../)
22. Créer deux fichier avec l’extension .c et deux fichier .py
23. Vous placer dans my_3_dir sans revenir au répertoire père (../)
24. Créer deux fichiers avec l’extension .c, deux fichiers .py, et deux fichiers .sh
25. Vous placez dans le répertoire père
26. Changer les noms des répertoires de my_1_dir à my_py_dir, my_2_dir à my_c_dir, et my_3_dir à
my_shell_dir (voir la commande mv)
27. En une commande, supprimer les fichiers avec l’extension .sh du répertoire my_py_dir, supprimer les
fichiers avec l’extension .py du répertoire my_c_dir, et supprimer les fichiers avec l’extension .c et .py du
répertoire my_shell_dir (pensez à *). On peut exécuter plusieurs commandes à la fois en les séparant par
un point-virgule ‘;’.
28. En une commande, créer un nouveau répertoire (applé all_codes) dans le répertoire père, puis copier tous
les fichiers des répertoires crées précédemment dans le répertoire all_codes (voir la commande cp).
29. Supprimer tout ce que vous avez créé et relancer vos commandes précédentes comme suit :

$ echo "commande1" >> my_script.sh ; echo "commande2" >> my_script.sh ; ...


Vous pouvez utiliser la commande history pour retrouver les commandes précédemment lancées.
30. Lancez la commande suivante :
$ sh my_script.sh
Vérifiez le résultat obtenu et comparez le avec le résultats des commandes avant suppression.
31. Que déduisez vous de la commande sh et du fichier my_script.sh ?

Les arguments d’un script shell:


Les arguments d'un script shell permettent de passer des informations à un script lors de son exécution. Ces
arguments sont des valeurs que vous spécifiez en ligne de commande au moment où vous lancez le script.
Voici une description de l'utilisation des arguments dans un script shell avec des exemples :

1. Lecture des Arguments :


Dans un script shell, les arguments sont accessibles via les variables spéciales $1, $2, $3, ..., qui représentent
respectivement le premier, le deuxième, le troisième argument, et ainsi de suite.
# Example : script.sh # Affiche les deux premiers arguments passés au script
echo "Le premier argument : $1"
echo "Le deuxième argument : $2"
Exécution
$ sh script.sh argument1 argument2
Le premier argument : argument1
Le deuxième argument : argument2

2. Nombre total d'Arguments :


Vous pouvez utiliser la variable spéciale $# pour obtenir le nombre total d'arguments passés au script.
# Example : count_args.sh
# Affiche le nombre total d'arguments passés au script
echo "Nombre total d'arguments : $#"
Exécution
$ sh count_args.sh arg1 arg2 arg3
Nombre total d'arguments : 3

32. Écrivez un script qui prend deux nombres en tant qu'arguments et affiche leur produit. Pour les
opérations arithmétiques, exécutez et essayer de comprendre leur fonctionnement selon l’exemple suivant :
#!/bin/bash
a=5
b=3
result=$((a + b))
echo "La somme de $a et $b est : $result"

33. Créez un script qui prend en paramètre votre nom et votre age. Ensuite, affichez un message qui indique
"Bonjour, [Nom] ! Vous avez [Âge] ans."
34. Écrivez un script qui prend deux nombres en entrée et effectue des opérations arithmétiques de base
(addition, soustraction, multiplication, division).

Les E/S en shell:


Dans un environnement shell, les opérations d'entrée/sortie (E/S) sont essentielles pour interagir avec le
système et gérer les données. Il existe trois types principaux d'E/S dans les scripts shell : l'entrée standard
(stdin), la sortie standard (stdout) et l'erreur standard (stderr). Ces flux permettent la communication entre le
script et l'utilisateur ou d'autres processus.
1. Entrée standard (stdin) :
Description : Stdin est le flux d'entrée par défaut. Il est utilisé pour recevoir des entrées de l'utilisateur ou
d'une autre commande ou fichier.
Exemple :
# Lire l'entrée de l'utilisateur
echo "Entrez votre nom :"
read nom
echo "Bonjour, $nom !"

# Utiliser stdin avec une commande


cat fichier.txt | grep "motif"

2. Sortie standard (stdout) :


Description : Stdout est le flux de sortie par défaut. Il est utilisé pour afficher la sortie des commandes ou des
scripts.
Exemple :
# Afficher sur stdout
echo "Ceci est un message vers la sortie standard."

# Rediriger stdout vers un fichier


echo "Bonjour, le monde !" > sortie.txt

# Ajouter au contenu d'un fichier


echo "Contenu supplémentaire" >> sortie.txt

3. Erreur standard (stderr) :


Description : Stderr est utilisé pour afficher des messages d'erreur et des informations de diagnostic. Il est
séparé de stdout, vous permettant de gérer les erreurs de manière indépendante.
Exemple :
# Écrire un message d'erreur sur stderr
echo "Erreur : Quelque chose s'est mal passé." >&2

# Rediriger stderr vers un fichier


commande_susceptible_d_echouer 2> erreur.log

4. Pipelines :
Description : Les pipelines connectent la sortie d'une commande à l'entrée d'une autre, vous permettant de
chaîner des commandes.
Exemple :
# Utiliser un pipeline pour filtrer la sortie
cat donnees.txt | grep "mot-clé" | sort

5. Substitution de commande :
Description : La substitution de commande vous permet de capturer la sortie d'une commande et de l'utiliser
dans une autre commande ou une assignation.
Exemple :
# Utiliser la substitution de commande
date_actuelle=$(date)
echo "Date actuelle : $date_actuelle"

35. Créez un script qui prend deux arguments (noms de fichiers) et les concatène dans un troisième fichier.

L’alternance en shell:
En script shell, l'instruction if est une structure de contrôle qui permet de prendre des décisions dans votre
script en fonction de l'évaluation d'une expression conditionnelle. La syntaxe de base d'une instruction if
dans un script shell est la suivante :

if [ condition ]; then
# Code à exécuter si la condition est vraie
else
# Code à exécuter si la condition est fausse
fi
Voici une explication des composants :
• if : Le mot-clé qui démarre le bloc conditionnel.
• [ condition ] : L'expression conditionnelle entre crochets carrés. Cette expression est évaluée comme
vraie ou fausse.
• then : Le mot-clé qui indique le début du bloc de code à exécuter si la condition est vraie.
• else : Mot-clé facultatif qui indique le début du bloc de code à exécuter si la condition est fausse.
• fi : Le mot-clé qui termine l'instruction if.

Voici un exemple d'instruction if dans un script shell simple :


#!/bin/bash

# Exemple de script pour vérifier si un nombre est positif ou négatif

echo "Entrez un nombre : "


read num

if [ $num -gt 0 ]; then


echo "Le nombre est positif."
elif [ $num -lt 0 ]; then
echo "Le nombre est négatif."
else
echo "Le nombre est zéro."
fi

36. Écrivez un script qui demande à l'utilisateur son âge et affiche un message différent en fonction de la
tranche d'âge (par exemple, enfant, adolescent, adulte).
37. Écrivez un script qui de mande à l’utilisateur d’introduire un nombre puis vérifie si ce nombre est pair ou
impair.
38. Écrivez un script qui compare deux chaînes et affiche un message en fonction du résultat de la
comparaison.

Les boucles en shell:


En programmation shell, les boucles permettent d'itérer sur un ensemble de données ou d'exécuter des
instructions répétitives. Il existe principalement deux types de boucles en shell : la boucle "for" et la boucle
"while". Voici une description de chaque type avec des exemples :

1. Boucle "for" :
for variable in liste_d_elements
do
# Instructions à exécuter pour chaque élément
done
Exemple
# Affiche les nombres de 1 à 5
for i in 1 2 3 4 5
do
echo $i
done
On peut également utiliser une séquence numérique avec l'opérateur « .. » :
# Affiche les nombres de 1 à 5
for i in {1..5}
do
echo $i
done
2. Boucle "while" :
La boucle "while" est utilisée pour exécuter des instructions tant qu'une condition spécifiée est vraie.
while condition
do
# Instructions à exécuter tant que la condition est vraie
done
Exemple
# Affiche les nombres de 1 à 5 en utilisant une boucle while
counter=1
while [ $counter -le 5 ]
do
echo $counter
((counter++))
done

39. Écrivez un script shell qui utilise une boucle "for" pour afficher les nombres pairs de 1 à 50.
40. Écrivez un script shell qui utilise une boucle "for" pour afficher la table de multiplication d'un nombre
spécifié par l'utilisateur.
41. Écrivez un script shell qui utilise une boucle "while" pour demander à l'utilisateur d'entrer un nombre N,
puis calcule la somme des nombres de 1 à N.
42. Écrivez un script shell qui génère un nombre aléatoire entre 1 et 100. Ensuite, utilisez une boucle "while"
pour demander à l'utilisateur de deviner le nombre. Donnez des indications telles que "trop grand" ou "trop
petit" jusqu'à ce que l'utilisateur devine correctement. Pour la génération d’un nombre aléatoire en shell,
utilisez la commande « shuf ». voici un exemple de son utilisation:
# Générer un nombre aléatoire entre 1 et 10
nombre_aleatoire=$(shuf -i 1-10 -n 1)

echo "Nombre aléatoire : $nombre_aleatoire"

Les fonctions en shell:


En shell, les fonctions permettent de regrouper des blocs de code réutilisables. Voici comment déclarer et
utiliser des fonctions en shell, avec quelques exemples simples.

Déclaration d’un fonction :


ma_fonction() {
# code de la fonction
}

Exemple 1 : Fonction simple sans paramètre ni retour


ma_fonction() {
echo "Bonjour, ceci est ma fonction."
}

# Appel de la fonction. Pas de parentheses ni arguments


ma_fonction

Exemple 2 : Fonction avec paramètre


saluer() {
echo "Bonjour, $1 !"
}

# Appel de la fonction avec un argument


saluer "Bob"

Exemple 3 : Fonction avec retour de valeur


calculer() {
result=$(( $1 + $2 ))
echo $result
}

# Appel de la fonction avec deux arguments et récupération du résultat


resultat=$(calculer 10 5)
echo "Le résultat est : $resultat"
Exemple 4 : Utilisation de variables locales
fonction_locale() {
local variable_locale="Ceci est une variable locale."
echo $variable_locale
}

# Appel de la fonction
fonction_locale

# Tentative d'accès à la variable locale en dehors de la fonction (cela échouera)


echo "Variable en dehors de la fonction : $variable_locale"

43. Écrivez une fonction appelée calculer_moyenne qui prend trois nombres en paramètres et renvoie leur
moyenne. Affichez le résultat.
44. Écrivez une fonction appelée convertir_celsius_fahrenheit qui prend une température en degrés Celsius
en paramètre et affiche la conversion en degrés Fahrenheit.
45. Écrivez une fonction récursive appelée afficher_nombres qui prend un nombre en paramètre et affiche
tous les nombres de 1 à ce nombre.
46. En utilisant les fonctions, ecrivez un script qui demande à l'utilisateur de saisir un nombre, puis affiche si
ce nombre est pair ou impair. Ensuite, le script doit demander à l'utilisateur s'il souhaite entrer un autre
nombre et répéter le processus jusqu'à ce que l'utilisateur choisisse de quitter.
47. Ecrivez un script qui permet à l'utilisateur de créer un fichier texte, d'ajouter des lignes de texte, puis
d'afficher le contenu du fichier à la fin. L'utilisateur choisit le nom du fichier, puis le script crée le fichier.
Ensuite, il demande à l'utilisateur de saisir des lignes de texte, les ajoute au fichier à l'aide d’une fonction, et
répète le processus jusqu'à ce que l'utilisateur décide de quitter en saisissant 'q'.
48. En utilisant les fonctions, ecrivez un script qui demande à l'utilisateur de saisir une liste de nombres triés
par ordre croissant, séparés par des espaces, puis effectue plusieurs opérations statistiques, y compris la
moyenne, l'écart type, la médiane.

Vous aimerez peut-être aussi