Blog ENI : Toute la veille numérique !
-25€ dès 75€ sur les livres en ligne, vidéos... avec le code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Linux
  3. Corrigé 8
Extrait - Linux Entraînez-vous sur les commandes de base : Exercices et corrigés (5e édition)
Extraits du livre
Linux Entraînez-vous sur les commandes de base : Exercices et corrigés (5e édition) Revenir à la page d'achat du livre

Corrigé 8

Prérequis

1.

Le premier point exécute le script .bashrc dans le shell appelant (shell courant).

Le second point indique le répertoire courant dans lequel se trouve actuellement l’utilisateur (chemin relatif).

Enfin, le troisième point est en première position dans le nom de fichier, ce qui indique que ce fichier est masqué.

2.

a.

Faux. Cette syntaxe provient du langage C.

b.

Faux. Comme la syntaxe précédente, celle-ci est utilisée en langage C.

c.

Vrai. Tout ce qui se trouve après le caractère # sur la ligne de commandes est ignoré par le Bash sauf si, bien sûr, celui-ci est protégé par un caractère de citation.

d.

Faux. Cette syntaxe est empruntée du langage HTML.

3.

a.

Vrai. La valeur du code retour d’une commande qui s’est terminée correctement est zéro.

b.

Faux. Tout code retour ayant une valeur différente de zéro signifie que la commande a retourné une erreur.

c.

Faux. Comme précédemment, la valeur différente de zéro indique que la commande s’est mal terminée.

d.

Faux. Le code retour d’une commande a une valeur comprise entre 0 et 255.

4.

a.

Vrai.

b.

Faux. -eq n’est pas un opérateur de la syntaxe (()).

c.

Vrai. La commande test et la syntaxe [] sont équivalentes.

d.

Faux. L’opérateur = teste l’égalité...

Corrigé 8.1 Appel et exécution de scripts shell

1.

Appuyez sur les touches [Ctrl]-[Alt]-[F3], puis :

localhost login: tux 
Password: <le mot de passe n'apparaît pas> 
[tux]$ 

2.

[tux]$ cd 
[tux]$ mkdir bin 
[tux]$ cd bin 
[tux]$ pwd 
/home/tux/bin 

3.

[tux]$ cat 01appel   
var="abc" 
echo "la variable \$var a pour valeur : $var" 
sleep 3 

4.

[tux]$ bash 01appel  
la variable $var a pour valeur : abc 
[tux]$ echo $var 
 
[tux]$ 

La variable var n’est pas définie dans l’environnement courant car le script 01appel s’est exécuté dans un shell fils.

5.

[tux]$ 01appel 
-bash: 01appel: command not found 
[tux]$ echo $PATH 
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin 
[tux]$ ./01appel 
-bash: ./01appel: Permission non accordée 

Pour que le script shell puisse être invoqué de cette manière, il faut spécifier son chemin s’il n’est pas présent dans un des répertoires listés par la variable d’environnement PATH, et modifier ses droits pour le rendre exécutable.

6.

[tux]$ chmod u+x 01appel  
[tux]$ PATH=$PATH:/home/tux/bin 
[tux]$ echo $PATH 
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/tux/bin 

7.

[tux]$ 01appel  
la variable $var a pour valeur : abc 
[tux]$ echo...

Corrigé 8.2 Code retour

1.

Appuyez sur les touches [Ctrl]-[Alt]-[F3], puis :

localhost login: tux 
Password: <le mot de passe n'apparaît pas> 
[tux]$ 

2.

[tux]$ ls /etc/passwd 
/etc/passwd 
[tux]$ echo $? 
0 

Note

Un code retour égal à zéro indique que la commande s’est correctement terminée.

3.

[tux]$ ls glop 
ls: glop: Aucun fichier ou répertoire de ce type 
[tux]$ echo $? 
1 

Note

Un code retour différent de zéro indique que la commande a retourné une erreur.

4.

[tux]$ echo $? 
0 

Ce code retour correspond à la commande echo précédente et indique que celle-ci s’est bien déroulée.

5.

Après modification du script, cela donne :

[tux]$ cd bin 
[tux]$ pwd 
/home/tux/bin 
[tux]$ cat 01appel  
#!/bin/bash 
var="abc" 
echo "la variable \$var a pour valeur : $var" 
sleep 3 
exit 2 
[tux]$ 01appel  
la variable $var a pour valeur : abc 
[tux]$ echo $? 
2 

Corrigé 8.3 Enchaînement de commandes

1.

[tux]$ date ; ls 
jeu. 23 févr. 2023 09:57:14 CET 
01appel 

Note

L’enchaînement de commandes avec le caractère ; est inconditionnel ; c’est-à-dire que la commande ls est exécutée quel que soit le code retour de la commande date.

2.

[tux]$ ls /etc/hosts >/dev/null 2>&1 && cat /etc/hosts 
# Do not remove the following line, or various programs 
# that require network functionality will fail. 
127.0.0.1               localhost.localdomain localhost 

3.

[tux]$ ls /tmp/glop >/dev/null 2>&1 || touch /tmp/glop     
[tux]$ ls /tmp/glop 
/tmp/glop 

Corrigé 8.4 Variables spéciales

1.

Après création du fichier 02varspec, cela donne :

[tux]$ cat 02varspec  
#!/bin/bash 
echo "mon nom est            : $0" 
echo "mon PID est            : $$" 
echo "le PID de mon père est : $PPID" 
[tux]$ chmod u+x 02varspec 

2.

[tux]$ echo $$ 
2885 
[tux]$ bash 02varspec  
mon nom est            : 02varspec 
mon PID est            : 4386 
le PID de mon père est : 2885 
[tux]$ 02varspec  
mon nom est            : /home/tux/bin/02varspec 
mon PID est            : 4388 
le PID de mon père est : 2885 
[tux]$ . 02varspec  
mon nom est            : -bash 
mon PID est            : 2885 
le PID de mon père est : 2884 

On constate bien que lors du troisième appel avec la commande . (point), le script shell 02varspec est interprété par le shell courant.

3.

[tux]$ cp 02varspec 03param 
[tux]$ chmod u+x 03param  
[tux]$ vi 03param 
#!/bin/bash 
echo "mon nom est            : $0" 
echo "mon PID est            : $$" ...

Corrigé 8.5 Tests de fichiers

1.

Après création du fichier 04fichier, cela donne :

[tux]$ cat 04fichier  
#!/bin/bash 
# on sort si le nom passé en premier paramètre positionnel n'est pas un fichier 
[ -e "$1" ] || exit 1 
# type de fichier 
[ -f "$1" ] && echo "$1 est un fichier standard" \ 
           || echo "$1 n'est pas un fichier standard" 
[ -d "$1" ] && echo "$1 est un répertoire" \ 
           || echo "$1 n'est pas un répertoire" 
# droits 
[ -r "$1" ] && echo "droit de lecture activé" 
[ -w "$1" ] && echo "droit d'écriture activé" 
[ -x "$1" ] && echo "droit d'exécution activé 
# contenu 
[ -s "$1" ] && echo "$1 contient des données" \ 
           || echo "$1 ne contient pas de données" 

2.

[tux]$ chmod u+x 04fichier 
[tux]$ 04fichier /glop 
[tux]$ echo $? 
1 
[tux]$ 04fichier /etc/hosts 
/etc/hosts est un fichier standard 
/etc/hosts n'est pas un répertoire 
droit de lecture activé 
/etc/hosts contient des données ...

Corrigé 8.6 Tests de chaînes de caractères

1.

Après création du fichier 05chaine, cela donne :

[tux]$ cat 05chaine  
#!/bin/bash 
# on sort si un des deux arguments est une chaîne de caractères nulle 
[ -z "$1" -o -z "$2" ] && exit 1 
# égalité 
[ "$1" = "$2" ] && echo "la chaîne '$1' est égale à '$2'" \ 
               || echo "la chaîne '$1' est différente de '$2'" 

2.

[tux]$ chmod u+x 05chaine 
[tux]$ 05chaine abc "" 
[tux]$ echo $?         
1 
[tux]$ 05chaine "" abc 
[tux]$ echo $?         
1 
[tux]$ 05chaine "" ""  
[tux]$ echo $?        
1 
[tux]$ 05chaine abc abc 
la chaîne 'abc' est égale à 'abc' 
[tux]$ 05chaine abc ABC 
la chaîne 'abc' est différente de 'ABC' 
[tux]$ 05chaine abc "abc " 
la chaîne 'abc' est différente de 'abc ' 

Corrigé 8.7 Tests et opérations arithmétiques

1.

Après création du fichier 06max, cela donne :

[tux]$ cat 06max  
#!/bin/bash 
# on sort si le nombre d'arguments est différent de 2 
[ $# -ne 2 ] && exit 1 
# recherche du nombre le plus grand 
[ "$1" -ge "$2" ] && echo $1 || echo $2 

2.

[tux]$ chmod u+x 06max  
[tux]$ 06max 12 
[tux]$ echo $? 
1 
[tux]$ 06max 12 34 
34 
[tux]$ 06max 12 6  
12 
[tux]$ 06max 12 12    
12 
[tux]$ 06max 12 " 34" 
34 

3.

Après création du fichier 07min, cela donne :

[tux]$ cat 07min  
#!/bin/bash 
# on sort si le nombre d'arguments est différent de 2 
(( $# != 2 )) && exit 1 
# recherche du nombre le plus petit 
(( "$1" <= "$2" )) && echo $1 || echo $2 

4.

[tux]$ chmod u+x 07min  
[tux]$ 07min 12 
[tux]$ echo $? 
1 
[tux]$ 07min 12 34 
12 
[tux]$ 07min 12 6  
6 
[tux]$ 07min 12 12 
12 
[tux]$ 07min 12 " 34" 
12 

5.

Après création du fichier 08div, cela donne :

[tux]$ cat 08div  
#!/bin/bash 
# on sort si le nombre d'arguments est différent de 2 
(( $# != 2 )) && exit 1 
# on sort si le second paramètre positionnel est égal à 0 
(( "$2"...

Corrigé 8.8 Scripts interactifs

1.

Après création du fichier 09mult, cela donne :

[tux]$ cat 09mult  
#!/bin/bash 
# saisie des nombres 
echo "Entrez le premier opérande :" ; read num1 
echo "Entrez le second opérande  :" ; read num2 
# affichage du résultat de l'opération 
echo $(( num1 * num2 )) 

2.

[tux]$ chmod u+x 09mult  
[tux]$ 09mult  
Entrez le premier opérande : 
12 
Entrez le second opérande  : 
3 
36 

Corrigé 8.9 Pour aller plus loin

1.

Après création du fichier 10compar, cela donne :

[tux]$ cat 10compar    
#!/bin/bash 
# on sort s'il n'y a pas d'argument 
(( $# == 0 )) && exit 1 
# initialisation des variables $min et $max 
min=$1 
max=$1 
shift 
# tant qu'il y a des arguments 
while (( $# > 1 )) 
do 
  max=$(06max $max $1) 
  min=$(07min $min $1) 
  # on traite l'argument suivant 
  shift 
done 
# affichage des résultats 
echo "nombre min : $min" 
echo "nombre max : $max" 

2.

[tux]$ 10compar   
[tux]$ echo $?    
1 
[tux]$ 10compar 1 
nombre min : 1 
nombre max : 1 
[tux]$ 10compar 1 2 
nombre min : 1 
nombre max : 2 
[tux]$ 10compar 1 2 3 
nombre min : 1 
nombre max : 3 
[tux]$ 10compar 3 5 2 6 1 8 7 
nombre min : 1 
nombre max : 8 

3.

Par exemple, avec l’outil graphique KDevelop :

Images/5-CO08-01.png