SE UNIX - Part4
SE UNIX - Part4
SE UNIX - Part4
Donnez les versions du script utilisant les boucles for, while et until.
Exercice 5 (Correction)
#!/bin/bash
if [ $# -eq 0 ]
then
echo "Saisir un nombre:"
read n
else
n=$1
fi
p=1
m=n
fct=1
for (( i=0 ; i<$n ; i++ ))
do
((p=$p*$n))
((fct=$fct*$m))
((m=$m-1))
done
echo "La puissance: $n^$n = $p"
echo "La factorielle: !$n = $fct"
Exercice 6
Nombre de lignes : 8
*
***
*****
*******
*********
***********
*************
***************
Exercice 6 (Correction)
#!/bin/bash
if [ $# -eq 0 ]
then
echo "Saisir un nombre de lignes:"
read lgn
else
lgn=$1
fi
for (( l=0 ; l<$lgn ; l++ ))
do
((esp=$lgn-$l-1))
for (( i=0 ; i<$esp ; i++ ))
do
echo –e " \c"
done
for (( i=0 ; i<2*$l+1 ; i++ ))
do
echo –e "*\c"
done
echo –e "\n"
done
Programmation shell scripts (2)
Les Tableaux
Le Bash gère également les variables « tableaux ». il est possible d'utiliser des tableaux à 1
dimension. Les éléments du tableau commencent toujours à l'indice 0.
#!/bin/bash
# ajouter un élément
Villes[5]=Lyon
#!/bin/bash
unset Villes[3]
echo "Tous les éléments : ${Villes[*]} "
unset Villes[*]
echo "Tous les éléments : ${Villes[*]} "
Les Tableaux
Le nombre d’éléments d’un tableau: echo ${#NOMTAB[*]}
#!/bin/bash
tab=( un deux trois quatre cinqcinq )
echo ${tab[@]/cin/XYZ}
echo ${tab[@]//cin/YY}
echo ${tab[@]//ci/}
echo ${tab[@]/#in/XY}
echo ${tab[@]/%nq/ZZ}
Annexe
Extraction de sous-chaînes avec l’opérateur ${}:
$ var=ABCDEFGHIJKLMNOPQRSTUVWXYZ
● L’option “:” de l’opérateur ${} permet
$ echo ${var:5:2}
d’extraire une sous-chaîne d’une variable.
FG
- La syntaxe est: $ echo ${var:20}
${variable:debut:longueur} UVWXYZ
$ variable=AZERTYUIOPAZERTYUIOP
● L’option “#” permet de supprimer le plus $ echo ${variable#AZE}
court préfixe correspondant au motif qui RTYUIOPAZERTYUIOP
vient après # : $ echo ${variable#*T}
- syntaxe : ${variable#motif} YUIOPAZERTYUIOP
$ echo ${variable#*[MNOP]}
- L’expression ${variable##motif}
PAZERTYUIOP
sert à éliminer le plus long préfixe $ echo ${variable##*T}
correspondant au motif transmis. YUIOP
$ echo ${variable##*[MNOP]}
Annexe
Extraction de sous-chaînes avec l’opérateur ${}:
#!/bin/bash
i=1 Script qui affiche le contenu d’un tableau
weekdays="Mon Tue Wed Thu Fri" (chaine de caractères contenant des
for day in $weekdays mots séparés) weekdays en utilisant un
do compteur i
echo "Weekday $((i++)): $day"
done
Les Fonctions
Un programme long est plus complexe et plus difficile à concevoir, coder et maintenir.
Par conséquent, il serait utile que la fonctionnalité globale d'un script soit séparée en
sous-sections plus petites et logiques. Ces sous-sections sont appelées fonctions Shell.
En particulier, la fonction est très utile lorsque vous avez certaines tâches qui doivent
être exécutées plusieurs fois. Ainsi, plutôt que d'écrire le même code, encore et
encore, il est préférable de l'écrire une fois dans une fonction et d'appeler la fonction à
chaque fois selon les besoins.
#!/bin/bash
function test1 {
echo "La première fonction"
}
test2() {
echo "La deuxième fonction"
}
test1
test2
test1
Les Fonctions
Passage d'arguments: #!/bin/bash
somme() {
Vous pouvez fournir les arguments juste
a=$1;b=$2
après le nom de la fonction. Ces paramètres
(( s=a+b ))
seront représentés par $1, $2, $3, et ainsi de
echo "La somme $a + $b=$s"
suite.
}
somme 5 4
somme 14 3
somme 8 7
echo "La somme 8+7=$?"
Les Fonctions
Définition de variables locales:
La commande typeset ou declare ou local permet de définir des variables locales à une
fonction. Exemple:
#!/bin/bash
function f1 {
local var1=0
echo "Dans f1 => var1 avant : $var1"
var1=100
echo "Dans f1 => var1 après : $var1"
echo "Dans f1 => var2 avant : $var2"
var2=200
echo "Dans f1 => var2 après : $var2"
}
var1=1;var2=2
echo "Dans script => var1 avant f1 : $var1"
echo "Dans script => var2 avant f1 : $var2"
f1
echo "Dans script => var1 après f1 : $var1"
echo "Dans script => var2 après f1 : $var2"
Les Fonctions
Imbrication de fonctions:
une fonction ne sera exécutable que lorsque l'interpréteur du Shell sera passé par le nom de
la fonction et seulement s'il passe par la partie du code contenant le nom. Exemples:
#!/bin/bash
echo "Début du script"
#La fonction n'est pas encore connue
fonction()
{
echo "Fonction"
}
#La fonction est maintenant connue et utilisable
echo "Suite du script"
fonction
#!/bin/bash
if test "$1" = "go"
then Si la condition n'a pas été vérifiée,
fonction(){ la fonction ne sera pas connue et
echo "Fonction" son appel provoquera une erreur
}
fi
fonction
Les Fonctions
Imbrication de fonctions:
une fonction ne sera exécutable que lorsque l'interpréteur du Shell sera passé par le nom de
la fonction et seulement s'il passe par la partie du code contenant le nom. Exemples:
#!/bin/bash
externe() {
echo "Fonction externe"
interne() {
echo "Fonction interne" Une fonction « interne » ne sera
} connue que si une autre fonction
} « externe » est appelée
interne
externe
interne
Les Fonctions
La trace de l’appel de fonction:
L'instruction « caller » donne des informations sur l'appelant de la fonction (n° de
ligne de l'appel, fonction appelante, nom du script):
#!/bin/bash
fct1() {
fct2
}
fct2() {
fct3
}
fct3() {
echo "fct3 caller 0"; caller 0 #(fct2)
echo "fct3 caller 1"; caller 1 #(fct1)
echo "fct3 caller 2"; caller 2 #(programme)
echo "fct3 caller 3"; caller 3 #(néant)
}
fct1
echo "main caller 0"; caller 0
Les Fonctions
Import d’un script dans un autre script:
L'instruction « source » permet d'importer un fichier à l'endroit où la commande
est exécutée:
somme.sh
#!/bin/bash
function somme { test.sh
a=$1;b=$2 #!/bin/bash
(( s=a+b )) source ./somme.sh
return $s somme 7 9
} echo $?
source ./produit.sh
produit.sh produit 7 7
#!/bin/bash echo $?
function produit {
a=$1;b=$2 Définition du chemin d’une source
(( p=a*b )) Dans l’exemple les 2 sources se
return $p trouvent dans le même dossier
}
Exercice 7
Tri à bulles:
Tableau d’entrée: 11 8 3 6
- Ecrivez un script «tri.sh» qui permet de trier par ordre croissant les éléments
d’un tableau saisi en entrant le nombre d’éléments du tableau en premier.
Exercice 8
Essayez de créez une fonction inverse() dont l’attribut est la variable saisie est
qui permet une sortie inversée