18. Programmation en SHELL BASH sous Linux

18.1. Exercices d'application

18.1.1. Utilisation de la fonction if

Ecrire un script qui dit si le paramètre passé est :

  • un fichier

  • un répertoire

  • inexistant


#!/bin/bash
# Script qui teste l'élément passé en paramètre.

if ! [ -e $1 ] ; then
        echo "$1 n'existe pas."
elif [ -f $1 ] ; then
        echo "$1 est un fichier."
elif [ -d $1 ] ; then
        echo "$1 est un dossier."
fi
		

Ecrivez un script qui n'affiche que les répertoires.


#!/bin/bash
# Script qui n'affiche que les répertoires.

for i in `ls -1` ; do
	if [ -d $i ] ; then
		echo $i
	fi
done
		

Ecrirez un script qui n'affiche que les fichiers


#!/bin/bash
# Script qui n'affiche que les fichiers.

for i in `ls -1` ; do
	if [ -f $i ] ; then
		echo $i
	fi
done
		

Ecrivez un script qui donne le nombre de fichiers et de répertoires


#!/bin/bash
# Script qui affiche le nombre de fichiers et de répetoires.

nbfic=0
nbrep=0

for i in `ls -1` ; do
	if [ -f $i ] ; then
		let nbfic=nbfic+1
	elif [ -d $i ] ; then
		let nbrep=nbrep+1
	fi
done

echo "Il y a :"
echo "$nbfic fichier(s)."
echo "$nbrep répertoire(s)."
		
Exemple d'utilisation :

cvanvinc@pinson ~/Bureau $ ./afficherNbFichiersRepertoires.sh 
Il y a :
7 fichier(s).
2 répertoire(s).
		

18.1.2. Utilisation de la fonction case

En utilisant la structure case, écrire un script qui :

  • affiche un menu

  • demande à l'utilisateur de saisir une option du menu

  • affiche à l'utilisateur l'option choisie


#!/bin/bash
# Affichage d'un menu

echo "*********** Menu général ************"
echo -e "<1>\tComptabilité"
echo -e "<2>\tGestion commerciale"
echo -e "<3>\tPaie"
echo -e "<9>\tQuitter"
echo "*************************************"

read choix

case $choix in
	1) echo "Vous avez choisi \"Comptabilité\"." ;;
	2) echo "Vous avez choisi \"Gestion commerciale\"." ;;
	3) echo "Vous avez choisi \"Paie\"." ;;
	9) echo "Bye bye." ;;
	*) echo "Vérifiez votre saisie." ;;
esac

		

18.1.3. Utilisation de la structure for

En utilisant la structure for, écrire un programme calcul.sh qui donne les valeurs de 'y' d'une fonction pour les valeurs de x allant de -10 à 10 avec un incrément de 1. Prenez par exemple la fonction y = 2x + 3.


#!/bin/bash

# Réglage de la fonction du type y=ax+b
a=2
b=3

for ((i=-10;i<=10;i=i+1)); do
	echo "y($i) = `expr $a \* $i + $b`"
done

		
Exemple d'utilisation :

cvanvinc@pinson ~/Bureau $ ./calcul.sh 
y(-10) = -17
y(-9) = -15
y(-8) = -13
y(-7) = -11
y(-6) = -9
y(-5) = -7
y(-4) = -5
y(-3) = -3
y(-2) = -1
y(-1) = 1
y(0) = 3
y(1) = 5
y(2) = 7
y(3) = 9
y(4) = 11
y(5) = 13
y(6) = 15
y(7) = 17
y(8) = 19
y(9) = 21
		

Modifier le programme pour la fonction y = x^2.


#!/bin/bash

echo -e "Fonction y = x^2\n----------------"

for ((i=-10;i<=10;i=i+1)); do
	echo "y($i) = `expr $i \* $i`"
done

		

Adaptez le programme avec la structure répéter.. jusqu'à.


#!/bin/bash

echo -e "Fonction y = x^2\n----------------"

# Initialisation
i=-10

until [ $i -eq 10 ] ; do
	echo "y($i) = `expr $i \* $i`"
	((i++)) # ou let i=i+1
done
		
Exemple d'utilisation :

cvanvinc@pinson ~/Bureau $ ./calcul.sh 
Fonction y = x^2
----------------
y(-10) = 100
y(-9) = 81
y(-8) = 64
y(-7) = 49
y(-6) = 36
y(-5) = 25
y(-4) = 16
y(-3) = 9
y(-2) = 4
y(-1) = 1
y(0) = 0
y(1) = 1
y(2) = 4
y(3) = 9
y(4) = 16
y(5) = 25
y(6) = 36
y(7) = 49
y(8) = 64
y(9) = 81
		

Adapter le script afin que les bornes -10 et +10 soient passées en paramètres au script.


#!/bin/bash

echo -e "Fonction y = x^2\n----------------"

for ((i=$1;i<=$2;i=i+1)); do
	echo "y($i) = `expr $i \* $i`"
done

		
Exemple d'utilisation :

cvanvinc@pinson ~/Bureau $ ./calcul.sh 10 15
Fonction y = x^2
----------------
y(10) = 100
y(11) = 121
y(12) = 144
y(13) = 169
y(14) = 196
y(15) = 225
		

Modifier le script de façon à ce que l'on puisse passer en paramètre l'incrément.


#!/bin/bash

echo -e "Fonction y = x^2\n----------------"

for ((i=$1;i<=$2;i=i+$3)); do
	echo "y($i) = `expr $i \* $i`"
done

		
Exemple d'utilisation :

cvanvinc@pinson ~/Bureau $ ./calcul.sh 10 15 2
Fonction y = x^2
----------------
y(10) = 100
y(12) = 144
y(14) = 196
		

18.1.4. Etude de la fonction si (if)

En utilisant la structure if, écrire un script qui :

  • affiche un menu

  • demande à l'utilisateur de saisir une option du menu

  • affiche à l'utilisateur l'option qu'il a choisie


#!/bin/bash

echo "*********** Menu général ************"
echo -e "<1>\tComptabilité"
echo -e "<2>\tGestion commerciale"
echo -e "<3>\tPaie"
echo -e "<9>\tQuitter"
echo "*************************************"

echo -n "Veuillez faire votre choix :"
read choix

if [ $choix -eq 1 ]; then
    echo "Vous avez choisi Comptabilité."
elif [ $choix -eq 2 ]; then
    echo "Vous avez choisi Gestion commerciale."
elif [ $choix -eq 3 ]; then
    echo "Vous avez choisi Paie."
elif [ $choix -eq 9 ]; then
    echo "Bye bye.."
fi

		

Vous aller maintenant utiliser un fichier data dans lequel vous stockerez les informations suivantes :


premier	3
deuxième	10
troisième	25
quatrième	2
cinquième	12
EOF
		
Construisez un script qui permet de n'afficher que les renseignements dont la valeur est supérieure à 10 :

#!/bin/bash

cat data| while true; do
    # Lecture du flux
    read ligne

    if [ "$ligne" == "EOF" ]; then
        exit 0
    fi

    set -- $ligne

    if [ $2 -ge 10 ]; then
        echo $ligne
    fi
done
	

18.1.5. Etude de la fonction répéter jusqu'à (until..do..done)

En utilisant la structure until..do..done, écrire un script qui :

  • demande à un utilisateur de saisir une commande système

  • exécute la commande ou affiche un message d'erreur si la commande ne s'est pas déroulée

  • répète cette opération tant que l'utilisateur le désire


		
#!/bin/bash
clear

echo "------------------------------------------------------"
echo "| Saisissez une commande, commande <Q> pour quitter. |"
echo "------------------------------------------------------"

cmd=dumb

until [ "$cmd" == "Q" -o "$cmd" == "q" ] ; do
	echo -n "commande : "
	read -r cmd
	
	# Eclatement de la commande en plusieurs arguments $1, $2 ...
	set -- $cmd
	# Vérification de l'existence de la commande.
	which $1 &> /dev/null

	if [ $? -ne 0 ] ; then # $? correspond à la dernière valeur retournée.
		echo "la commande $cmd n'existe pas !!"
	else
		# Evaluation de la commande 
		eval $cmd 2> /dev/null
	fi
done
		
		

18.1.6. Etude de la fonction tant que (while)


#!/bin/bash
# Etude de la fonction while
clear

echo "********************** Menu général **********************"
echo -e "<1>\tAfficher la date (date)"
echo -e "<2>\tAfficher le nombre de personnes connectées (who)"
echo -e "<3>\tAfficher la liste des processus (ps)"
echo -e "<9>\tQuitter"
echo "**********************************************************"

input=0

while [ $input -ne 9 ]; do
    # Lecture du choix utilisateur
    echo -n "Choix :"
    read input
	
    # Contrôler si il s'agit bien d'un integer.
    #if [  ]; then
    #    continue
    #fi
    
    case $input in
        1) echo "Affichage de la date :"; date;;
        2) echo "Affichage du nombre de personnes connectées :"; who;;
        3) echo "Affichage de la liste des processus :"; ps;;
        9) echo "Bye bye..";;
        *);;
    esac
done

18.1.7. Etude de la fonction select

Vous allez, à l'aide de la fonction select, réaliser un menu à quatre options pour un utilisateur. Le script doit boucler tant que l'utilisateur n'a pas choisi de quitter.


#!/bin/bash
# Etude de la fonction select

select choix in \
    "Affiche la liste des utilisateurs connectés" \
    "Affiche la liste des processus" \
    "Afficher à l'utilisateur son, son UID, son GID, son TTY1" \
    "Terminer"
do
    case $REPLY in
        1) echo "$choix"; who;;
        2) echo "$choix"; ps;;
        3) echo "$choix"; id;;
        *) echo "Bye bye.."; exit 0;;
    esac
done
Exemple d'utilisation :

cvanvinc@pinson ~/Bureau $ ./select.sh 
1) Affiche la liste des utilisateurs connectés
2) Affiche la liste des processus
3) Afficher à l'utilisateur son, son UID, son GID, son TTY1
4) Terminer
#? 1
Affiche la liste des utilisateurs connectés
cvanvinc tty7         2012-02-16 08:44 (:0)
cvanvinc pts/1        2012-02-16 10:18 (:0.0)
cvanvinc pts/2        2012-02-16 10:20 (:0.0)
cvanvinc pts/3        2012-02-16 10:25 (:0.0)
#? 2
Affiche la liste des processus
  PID TTY          TIME CMD
15911 pts/3    00:00:00 select.sh
15925 pts/3    00:00:00 ps
28717 pts/3    00:00:00 bash
#? 2
Affiche la liste des processus
  PID TTY          TIME CMD
15911 pts/3    00:00:00 select.sh
15930 pts/3    00:00:00 ps
28717 pts/3    00:00:00 bash
#? 3
Afficher à l'utilisateur son, son UID, son GID, son TTY1
uid=2498(cvanvinc) gid=6052(m2isidis) groupes=6052(m2isidis)
#? 4
Bye bye..

18.1.8. Création de fonctions SHELL

  • En utilisant les structures que vous connaissez, écrire un script mul.sh qui affiche la table de multiplication d'un nombre donné en paramètre. Exemple mul.sh 4, donne la table de multiplication de 4. Vous afficherez les résultats pour un multiplicateur allant de 1 à 10. L'affichage de la table de multiplication sera réalisé par une fonction affTABLE().

    
				
    #!/bin/bash
    # Affiche la table des multiplications
    
    function affTABLE {
        for ((i=0;i<=10;i++)); do
            echo "$i x $1 = `expr $i \* $1`"
        done
    }
    
    affTABLE $1
    

    Exemple d'utilisation :

    
cvanvinc@pinson ~/Bureau $ ./mul.sh 4
    0 x 4 = 0
    1 x 4 = 4
    2 x 4 = 8
    3 x 4 = 12
    4 x 4 = 16
    5 x 4 = 20
    6 x 4 = 24
    7 x 4 = 28
    8 x 4 = 32
    9 x 4 = 36
    10 x 4 = 40
    
  • Modifier le script afin que les bornes du multiplicateur soient passés en paramètres : Exemple mul.sh 3 25 35. On veut la table de multiplication de 3*25 jusqu'à 3*35.

    
			
    #!/bin/bash
    # Affiche la table des multiplications
    
    function affTABLE {
    for ((i=$2;i<=$3;i++)); do
            echo "$i x $1 = `expr $i \* $1`"
        done
    }
    
    affTABLE $1 $2 $3
    

    Exemple d'utilisation :

    
cvanvinc@pinson ~/Bureau $ ./mul.sh 4 25 35
    25 x 4 = 100
    26 x 4 = 104
    27 x 4 = 108
    28 x 4 = 112
    29 x 4 = 116
    30 x 4 = 120
    31 x 4 = 124
    32 x 4 = 128
    33 x 4 = 132
    34 x 4 = 136
    35 x 4 = 140
    
  • Modifier le programme de façon à écrire une calculatrice. L'utilisateur saisit un nombre (par exemple 3). Ensuite il saisira des couples opérateur nombre (exemple + 3). Le programme réalisera les opérations jusqu'à ce que l'utilisateur tape l'opérateur "=" et affichera le résultat final.

    
    				

18.1.9. Appels et contrôles de scripts

#!/bin/bash # Calculatrice élémentaire # Déspécialisation masque=\\ function calcul { case $2 in "\+") nombre1=`expr $1 + $3`;; "\-") nombre1=`expr $1 - $3`;; "\/") nombre1=`expr $1 / $3`;; "\*") nombre1=`expr $1 \* $3`;; *) echo "opérateur \"$2\" inconnu";; esac } clear echo "----- Calculatrice minimaliste -----" echo -n "Entrez un nombre :" read nombre1 echo "Entrez une opération (eg. + 10) :" read operateur nombre2 while [ "$operateur" != "=" ]; do operateur=$masque$operateur calcul $nombre1 $operateur $nombre2 read operateur nombre2 done echo "résultat = $nombre1"

18.1.10. Appels et contrôles de scripts


#!/bin/bash

while true; do
    # lance le processus Ping
    ./Ping.sh &
    # attend dix secondes
    sleep 10
    # tue le processus Ping
    killall Ping.sh
    echo "Ping est mort."

    # lance le processus Pong
    ./Pong.sh &
    # attend dix secondes
    sleep 10
    # tue le processus Ping
    killall Pong.sh
    echo "Pong est mort."
done