Table des matières


Bash


Premier pas

Q1: Ouvrez un terminal.

Q2: Consultez la documentation de la commande hostname. À quoi sert-elle ? Exécutez la.

Q3: Consultez la documentation des commandes users et who. Utilisez ces commandes pour afficher votre identifiant de connexion.

Premier script shell

Q4: Lancez un éditeur de texte. Le choix de l’éditeur vous appartient. Vous pouvez par exemple utiliser Sublime Text, Emacs, Atom, Gedit, code, Vi ou Nano. Cependant, n’utilisez pas les logiciels de traitement de texte comme Word ou LibreOffice. Ils ne sont pas fait pour le code et leurs fichiers ne sont pas au format adéquat.

Q5: Écrivez un script shell permettant d’afficher : Hello World dans le terminal. Nommez ce script hello.sh.

Q6: Rendez le script exécutable en lançant, dans le terminal, la commande donnée en cours (chmod u+x hello.sh).

Q7: Exécutez votre script.

Manipulation des arguments

Le comportement d’un script dépend souvent de données extérieures : des arguments passés en paramètre de la commande, une saisie manuelle par l’utilisateur dans le terminal lors de l’exécution, un fichier, etc. Voyons comment utiliser les arguments pour nos scripts.

Q8: Modifiez le script de l’exercice précédent afin de nommer quelqu’un en particulier grâce à un argument passé sur la ligne de commande. L’affichage devra être, par exemple :

./hello.sh stranger
 Hello stranger!

Q9: Modifiez votre script afin qu’il prenne en compte non plus un argument, mais tous les arguments donnés sur la ligne de commande. Par exemple :

./hello.sh Thrall Garrosh Arthas
Hello Thrall !
Hello Garrosh !
Hello Arthas !

ou

./hello.sh "Go’el alias Thrall" "Garrosh Hellscream" "Arthas Menethil"
Hello Go’el alias Thrall !
Hello Garrosh Hellscream !
Hello Arthas Menethil !

Le squelette de l’algorithme devrait ressembler à cela :

# pour chaque argument de la liste des arguments de la ligne de commande du script
# afficher la chaîne Hello suivie de l’argument courant suivie de !

Q10: Modifiez votre script afin qu’il affiche la chaîne « Hello Sargeras ! » si aucun argument n’a été donné.

#! /bin/bash
#
# si le script n’a pas d’argument alors
# afficher la chaîne "Hello Sargeras !"
# sinon
# pour chaque argument de la liste des arguments de la ligne de commande du script
# afficher la chaîne Hello suivie de l’argument courant suivie de !

Q11: Modifiez votre script précédent en utilisant un boucle while au lieu du for. Ex :

#! /bin/bash
#
# si le script n’a pas d’argument alors
# afficher la chaîne "Hello Sargeras !"
# sinon
# tant que le nombre d’arguments est strictement supérieur à 0
# afficher la chaîne Hello suivie de l’argument courant suivie de !
# décaler l’argument courant

Q12: On souhaite maintenant rendre notre script mal élevé. Votre script ne saluera donc plus qu’une personne sur deux. Par exemple :

$ ./hello.sh Thrall Garrosh Varian Arthas Malygos
Hello Thrall !
Hello Varian !
Hello Malygos !

Système de fichiers

Jusqu’à la fin de ce TP, l’utilisation de la souris est interdite.

Initialisation

Q1: Positionnez vous dans votre home à l’aide d’une unique commande.

Q2: Créez un répertoire nommé F110_est_une_ue_absolument_geniale.

Q3: Renommez le répertoire F110”* car tout compte fait le nom est assez pénible. Nous allons maintenant organiser ce répertoire pour les prochaines séances de TP.

Q4: Créez un répertoire TP1 à l’intérieur de ce répertoire F110.

Q5: Créez un répertoire Part1 dans le répertoire TP1.

Q6: Déplacez le/les fichier(s) .sh créé lors de la première partie du TP dans ce dernier répertoire.

Q7: Pour la seconde partie du TP, créez un répertoire Part2 dans le répertoire TP1.

Q8: Placez vous dans le répertoire TP1.

Q9: Déplacez-vous dans le répertoire représentant la première partie de ce TP.

Q10: Affichez le chemin du répertoire courant.

Q11: Affichez le contenu du répertoire parent au répertoire courant.

Q12: Taper la commande echo \~. Comment le shell interprète t-il le tilde ? Qu’en déduisez vous quant à la nature du chemin utilisé ?

À ce stade, vous devez vous trouvez dans le répertoire ayant pour chemin \~/TP1/Part2.

Q13: Sans vous déplacer, afficher le contenu du répertoire créé pour la première partie du TP en utilisant un chemin absolu.

Q14: Sans vous déplacer, afficher le contenu de votre répertoire créé pour la première partie du TP en utilisant un chemin relatif.

Q15: Créez un répertoire nommé test_tmp dans le répertoire courant et déplacez-vous y.

Q16: Copiez le fichier /etc/passwd dans le répertoire courant.

Q17: Dupliquez le fichier passwd dans le répertoire courant avec comme nouveau nom de fichier passwd2.

Q18: Regardez les numéros d’inodes de ces deux fichiers avec l’option -i de la commande ls. Expliquez pourquoi elles sont différentes.

Q19: Renommez le dernier fichier passwd2 en passwd3.

Q20: Regardez le numéro d’inode du fichier passwd3 et comparez-le à celui qu’avait le fichier passwd2. Expliquez pourquoi ces numéros d’inodes sont identiques.

Q21: Supprimez le fichier passwd.

Q22: Supprimez le répertoire test.

Droits d’accès

Dans cet exercice, pensez à vérifier à chaque fois que nécessaire que les droits d’accès sont correctement positionnés à l’aide de la commande ls -l.

Q23: Créez le répertoire tmp dans votre répertoire Part2 et positionnez les droits d’accès à “rwx r-x —”. A quoi correspondent ces droits ?

Q24: Copiez le fichier /etc/hosts dans tmp avec comme nouveau nom liste_hosts . Positionnez les droits d’accès à “rw- r– —” et lisez son contenu via une commande.

Q25: Supprimer le droit en lecture pour le propriétaire de liste_hosts et essayez de relire son contenu.

Q26: Retirez pour le propriétaire le droit en écriture (w) de tmp et essayez de détruire liste_hosts.

Q27: Retirez pour le propriétaire le droit en lecture (r) de tmp et essayez de lister son contenu.

Q28: Retirez pour le propriétaire le droit en exécution (x) de tmp et essayez de vous positionner sur ce répertoire. On a aussi perdu le droit de traverser le répertoire : impossible de se positionner dedans.

Q29: Positionnez pour le propriétaire les droits d’accès rwx du répertoire tmp.

Q30: Effacez en une seule commande tout le contenu du répertoire tmp et le répertoire lui-même.

Liens directs et liens symboliques

Q31: Placez-vous dans le répertoire Part2.

Q32: Copiez à nouveau dans ce répertoire le fichier /etc/passwd et nommez-le my_passwd.

Q33: Affichez le contenu du fichier my_passwd.

Q34: Créez un répertoire nommé Liens dans le répertoire courant.

Q35: Déplacez-vous dans le répertoire Liens.

Q36: Sans vous déplacer, créez dans le répertoire Liens le lien direct lien.txt sur le fichier my_passwd de votre répertoire parent.

Q37: Utilisez la commande ls pour afficher le numéro d’inode des fichiers my_passwd et lien.txt. Qu’observez-vous ?

Q38: Affichez le contenu du fichier lien.txt. Cela doit afficher le même contenu qu’à la question précédente.

Q39: Toujours sans vous déplacer, créez dans le répertoire Liens le lien symbolique lien_symb.txt vers le fichier my_passwd. Utilisez un chemin relatif pour référencer le fichier my_passwd.

Q40: Utilisez la commande ls pour afficher le numéro d’inode des fichiers my_passwd et lien_symb.txt. Qu’observez-vous ?

Q41: Affichez le contenu du fichier lien_symb.txt.

Q42: Déplacez le fichier lien_symb dans le répertoire Part2.

Q43: Affichez le contenu des fichiers lien.txt et lien_symb.txt. Expliquez le résultat obtenu.

Q44: Réparez le lien symbolique brisé en remplaçant le chemin relatif par un chemin absolu.

Q45: Affichez le contenu du lien_symb.txt.

Q46: Déplacez à nouveau lien_symb.txt dans le dossier Lien. Affichez le contenu de lien_symb.txt. Que constatez vous ?

Q47: Déplacez my_passwd dans le répertoire Lien et affichez le contenu de lien_symb.txt. Comment expliquez vous ce comportement ?

Corrections


Premier script shell

#!/bin/bash

if [[ $# -eq 0 ]]; then
	echo Hello Sargeras !
else
while [[ $# -ne 0 ]]; do #IE : Tant que l'arg 1 n'est pas nul, on itère !
  echo "Hello $1 !"
  shift
  shift  # SOLUTION SIMPLE : AJOUTER un SHIFT pour SAUTER un ARGUMENT, MARCHE EGALEMENT DANS BOUCLE FOR
done
fi

<<COMMENT
#SOLUTION 1
if [[ $# -eq 0 ]]; then
	echo Hello Sargeras !
else
for param in "$@"; do
 echo "Hello $param !"
done

fi
COMMENT