• Aucun résultat trouvé

« OPEN SOURCE »

N/A
N/A
Protected

Academic year: 2022

Partager "« OPEN SOURCE »"

Copied!
69
0
0

Texte intégral

(1)

SYSTÈMES D'EXPLOITATION

« OPEN SOURCE »

(2)

Programmation shell

(3)

Présentation

Le shell n'est pas qu'un simple interpréteur

de commandes, mais dispose d'un véritable

langage de programmation avec notamment

une gestion des variables, des tests et des

boucles, des opérations sur variables, des

fonctions...

(4)

Le premier programme

#!/bin/bash

# fichier : bonjour.sh

# Affiche un salut a l’utilisateur echo "Bonjour $USER"

Les premières lignes sont des lignes de commentaires qui doivent commencer par un caractère "#" en première colonne.

La notation #! en première ligne d'un fichier interprété précise au shell courant quel interpréteur doit être utilisé pour exécuter le script shell (dans cet exemple, il s’agit de /bin/bash).

Dans quel cas utilise-t-on les scripts ?

Pour effectuer un travail répétitif

Pour des taches d’administration système

Pour installer des programmes

Au démarrage du système pour démarrer les services et applications

(5)

Structure et exécution d'un script

Par convention les shell scripts se terminent généralement (pas

obligatoirement) par « .sh » pour le Bourne Shell et le Bourne Again Shell, par « .ksh » pour le Korn Shell et par « .csh » pour le C Shell.

Pour lancer l’exécution d’un fichier shell, on peut utiliser la commande : bash

$ bash monscript

Il est plus simple de lancer l’exécution d’un programme shell en tapant

directement son nom, comme on le ferait pour une commande unix ou une commande interne.

Pour que cela soit réalisable, deux conditions doivent être remplies :

l’utilisateur doit posséder les permissions r (lecture) et x (exécution) sur le fichier shell :

$ chmod u+x monscript

Pour l'exécuter : $ ./monscript

Pour éviter le ./ le répertoire dans lequel se trouve le fichier shell doit être présent dans la liste des chemins contenue dans PATH. :

$ PATH=$PATH:.

$ monscript

(6)

Structure et exécution d'un script

Une ligne de commentaire commence toujours par le caractère « # ».

Un commentaire peut être placé en fin d'une ligne comportant déjà des commandes.

# La ligne suivante effectue un ls ls # La ligne en question

La première ligne à une importance particulière car elle permet de préciser quel shell va exécuter le script

#!/bin/sh

#!/bin/ksh

Dans le premier cas c'est un script Bourne, dans l'autre un script Korn Dans notre cas on va utiliser le Bourne Again Shell

#!/bin/bash

(7)

Structure et exécution d'un script

Écrire un programme shell monscript1 qui affiche le nom de connexion de

l'utilisateur et le chemin absolu de son répertoire courant de la manière suivante :

Ex : $ monscript1

mon nom de connexion est : stagiaire

mon repertoire courant est : /home/stagiaire

$

Exercice 1

(8)

Substitution de paramètres

Dans la terminologie du shell, un paramètre désigne toute entité pouvant contenir une valeur.

Le shell distingue trois classes de paramètres :

les variables, identifiées par un nom Ex : a , PATH

les paramètres de position, identifiés par un numéro, Ex : 0 , 1 , 12

les paramètres spéciaux, identifiés par un caractère spécial , Ex : # , ? , $

Pour obtenir la valeur d'un paramètre, on placera toujours le caractère $ devant sa référence.

Exemple :

$ echo $PATH => affiche la valeur de la variable PATH

$ echo $$ => affiche la valeur du paramètre spécial $

(9)

Les variables

Une variable est identifiée par un nom, c'est-à-dire une suite de lettres, de chiffres ou de caractères espace souligné ne commençant pas par un chiffre. Les lettres majuscules et minuscules sont différenciées.

Les variables peuvent être classées en trois groupes :

les variables utilisateur (ex : a, valeur)

les variables prédéfinies du shell (ex : PS1, PATH, REPLY, IFS)

les variables prédéfinies de commandes unix (ex : TERM).

Un nom de variable obéit à certaines règles :

Il peut être composé de lettres minuscules, majuscules, de chiffres, de caractères de soulignement

Le premier caractère ne peut pas être un chiffre

La taille d'un nom est en principe illimité (il ne faut pas abuser non plus)

Les conventions veulent que les variables utilisateur soient en minuscules pour les différencier des variables système. Au choix de l'utilisateur.

Nomenclature

(10)

Les variables

L’utilisateur peut affecter une valeur à une variable en utilisant

l’opérateur d’affectation =

la commande interne read.

Déclaration et affectation

Une variable est déclarée dès qu'une valeur lui est affectée. L'affectation est effectuée avec le signe « = », sans espace avant ou après le signe.

var=Bonjour

On peut aussi créer des variables vides. Celle-ci existera mais sans contenu.

var=

Affectation directe

(11)

Les variables

Elle s’effectue à l'aide de la commande interne read. Celle-ci lit une ligne entière sur l’entrée standard.

Syntaxe : read [ var1 ... ]

Affectation par lecture

Ex : $ read a b

bonjour Monsieur => chaînes saisies par l’utilisateur et enregistrées respectivement dans les variables a et b

$ echo $b Monsieur

L’option –p de read affiche une chaîne d’appel avant d’effectuer la lecture la syntaxe à utiliser est : read –p chaîne_d_appel [ var ]

Ex : $ read -p "Entrez votre prenom : " prenom Entrez votre prenom : toto

$ echo $prenom toto

(12)

Les variables

Lorsque la commande interne read est utilisée sans argument, la ligne lue est enregistrée dans la variable prédéfinie du shell REPLY

S’il y a moins de variables que de mots dans la ligne lue, le shell affecte le premier mot à la première variable, le deuxième mot à la deuxième variable, etc., la dernière variable reçoit tous les mots restants.

S’il y a davantage de variables que de mots dans la ligne lue, chaque variable reçoit un mot et après épuisement de ces derniers, les variables excédentaires sont vides (c.-à-d. initialisées à la valeur null).

Remarques sur la commande interne read

$ read

bonjour tout le monde

$ echo $REPLY

bonjour tout le monde

$ read a b c

un bon jour coucou

$ echo $a un

$ echo $c

$ read a b un

$ echo $a un

$ echo $b EXEMPLE

(13)

Les variables

On accède au contenu d'une variable en plaçant le signe « $ » devant le nom de la variable.

Quand le shell rencontre le « $ », il tente d'interpréter le mot suivant comme étant une variable. Si elle existe, alors le $nom_variable est remplacé par son contenu, ou par un texte vide dans le cas contraire.

On parle aussi de référencement de variable.

# chemin=/home/user

# ls $chemin

Accès et affichage

(14)

Les variables

Pour afficher la liste des variables on utilise la commande set. Elle affiche les variables utilisateur et les variables système, nom et contenu.

La commande echo permet d'afficher le contenu de variables spécifiques.

Une variable peut contenir des caractères spéciaux, le principal étant l'espace. Mais

# c=Salut les copains

bash: les: command not found

# echo $c

Ne marche pas. Pour cela il faut soit verrouiller les caractères spéciaux un par un, soit de les mettre entre guillemets ou apostrophes.

c=Salut\ les\ Copains # Solution lourde c="Salut les copains" # Solution correcte c='Salut les copains' # Solution correcte

Accès et affichage

(15)

Les variables

La principale différence entre les guillemets et les apostrophes est :

l'interprétation des variables et des substitutions.

" et ' se verrouillent mutuellement.

# a=omar

# b=said

# c="$a et $b sont des amis"

# d='$a et $b sont des amis '

# echo $c

omar et said sont des amis

# echo $d

$a et $b sont des amis

# echo "Unix c'est top"

Unix c'est top

# echo 'Unix "trop bien"' Unix "trop bien"

Accès et affichage

(16)

Les variables

On supprime une variable avec la commande unset.

On peut protéger une variable en écriture et contre sa suppression avec la commande readonly. Une variable en lecture seule même vide est figée. Il n'existe aucun moyen de la replacer en écriture et de la supprimer, sauf à quitter le shell.

# a=omar

# b=said

# echo $a $b omar said

# unset b

# echo $a $b omar

# readonly a

# a=said

bash: unset: a: readonly variable

# unset a

Suppression et protection

(17)

Les variables

Par défaut une variable n'est accessible que depuis le shell où elle a été définie.

La commande export permet d'exporter une variable de manière à ce que son contenu soit visible par les scripts et autres sous-shells. Les

variables exportées peuvent être modifiées dans le script, mais ces modifications ne s'appliquent qu'au script ou au sous-shell.

Exportation

# a=omar

# cat > exemple1

#!/bin/bash

echo "Mon premier script "

echo $a

# exemple

Mon premier script

# export a

# exemple

Mon premier script omar

(18)

Les variables

Les accolades de base « {} » permettent d'identifier le nom d'une variable.

Imaginons la variable fichier contenant le nom de fichier 'liste'.

On veut copier liste1 en liste2.

$ fichier=liste

$ cp $fichier2 $fichier1

Ça ne fonctionne pas car ce n'est pas $fichier qui est interprété mais

$fichier1 et $fichier2 qui n'existent pas.

$ cp ${fichier}2 ${fichier}1

Dans ce cas, cette ligne équivaut à

$ cp liste2 liste1

Les accolades indiquent que fichier est un nom de variable.

Accolades

(19)

Les variables

Les accolades disposent d'une syntaxe particulière.

{variable:Remplacement}

Selon la valeur ou la présence de la variable, il est possible de remplacer sa valeur par une autre.

Remplacement Signification

---

{x:-texte} si la variable x est vide ou inexistante, le texte prendra sa place. Sinon c'est le contenu de la variable qui prévaudra.

{x:=texte} si la variable x est vide ou inexistante, le texte prendra sa place et deviendra la valeur de la variable.

{x:+texte} si la variable x est définie et non vide, le texte prendra sa place. Dans le cas contraire une chaîne vide prend sa place.

{x:?texte} si la variable x est vide ou inexistante, le script est interrompu et le message texte s'affiche. Si texte est absent un message d'erreur standard est affiché.

Accolades et remplacement conditionnel

(20)

Les variables

$ echo $nom

$ echo ${nom:-Jean}

$ echo $nom

$ echo ${nom:=Jean}

Jean

$ echo $nom Jean

$ echo ${nom:+"Valeur définie"}

Valeur définie

$ unset nom

$ echo ${nom:?Variable absente ou non définie}

nom: Variable absente ou non définie

$ nom=Jean

$ echo ${nom:?Variable absente ou non définie}

Jean

Accolades et remplacement conditionnel (exemple)

(21)

Les variables

En plus des variables que l'utilisateur peux définir lui-même, le shell est lancé avec un certain nombre de variables prédéfinies utiles pour un certain nombre de commandes et accessibles par l'utilisateur.

Le contenu de ces variables système peut être modifié mais il faut alors faire attention car certaines ont une incidence directe sur le comportement du

système.

Exemple :

HOME : contient le Chemin du répertoire personnel de l'utilisateur.

PATH : Liste de répertoires, séparés par des « : » où le shell va rechercher les commandes externes et autres scripts et binaires. La recherche se fait dans l'ordre des répertoires saisis.

SHELL : Chemin sur le fichier de programme du shell actuellement utilisé.

Sous Linux, il s'agit souvent du shell bash.

Variables système

(22)

Les variables

Il s'agit de variables accessibles uniquement en lecture et dont le contenu est généralement contextuel.

Variable Contenu

---

$? : Code retour de la dernière commande exécutée

$$ : PID du shell actif

$! : PID du dernier processus lancé en arrière-plan

Variables spéciales

(23)

Les variables

Les paramètres de position sont aussi des variables spéciales utilisées lors d'un passage de paramètres à un script.

Variable Contenu

---

$0 Nom de la commande (du script)

$1-9 $1,$2,$3... Les neuf premiers paramètres passés au script

$# Nombre total de paramètres passés au script

$* Liste de tous les paramètres au format "$1 $2 $3 ..."

$@ Liste des paramètres sous forme d'éléments distincts "$1" "$2" "$3" ...

Paramètres de position

Exemple :

#!/usr/bin/sh echo "Nom : $0"

echo "Nombre de parametres : $#"

echo "Parametres : 1=$1, 2=$2, 3=$3"

echo "Liste : $*"

Un script peut accepter des arguments : script.sh arg1 arg1 arg1

(24)

Les variables

Paramètres de position

Exemple :

$ set un deux trois => trois paramètres de position sont initialisés

$ set "$*" => est équivalent à : set “un deux trois”

$ echo $#

1

$ echo $1

Les paramètres spéciaux @ et * contiennent tous deux la liste des valeurs des paramètres de position initialisés.

Ces deux paramètres ont des valeurs distinctes lorsque leur référence est placée entre des guillemets ("$*" et "$@") :

"$*" est remplacée par "$1 $2 ... "

"$@" est remplacée par "$1" "$2" ...

L’intérêt de la syntaxe "$*" est de pouvoir considérer l’ensemble des

paramètres de position initialisés comme une unique chaîne de caractères.

(25)

Les variables

la commande set permet de redéfinir le contenu des variables de position.

Avec set valeur1 valeur2 valeur3 ...

$1 prendra comme contenu valeur1, $2 valeur2 et ainsi de suite.

Redéfinition des paramètres

Exemple :

#!/usr/bin/sh echo "Avant :"

echo "Nombre de parametres : $#"

echo "Parametres : 1=$1 2=$2 3=$3 4=$4"

echo "Liste : $*"

set omar said khalid ali

echo "apres set omar said khalid ali"

echo "Nombre de parametres : $#"

echo "Parametres : 1=$1 2=$2 3=$3 4=$4"

echo "Liste : $*"

(26)

Les variables

La commande shift permet de modifier la structure des paramètres de position. Un appel simple décale tous les paramètres d'une position en supprimant le premier : $2 devient $1, $3 devient $2 et ainsi de suite. Le $1 originel disparaît. $#, $* … sont

redéfinis en conséquence.

La commande shift suivie d'une valeur n effectue un décalage de n éléments. Ainsi avec shift 4 : $5 devient $1, $6 devient $2, ...

Réorganisation des paramètres

Exemple :

#!/usr/bin/sh

echo "Nombre de parametres : $#"

echo "Parametres : 1=$1 2=$2 3=$3 4=$4"

echo "Liste : $*"

shift

echo "apres un shift"

echo "Nombre de parametres : $#"

echo "Parametres : 1=$1 2=$2 3=$3 4=$4"

(27)

Substitution de commande

Le mécanisme de substitution permet de placer le résultat de commandes

simples ou complexes dans une variable. On place les commandes à exécuter entre des accents graves « ` ». (Alt Gr + 7).

Exemple :

$ mon_unix=`uname`

$ echo ${mon_unix}

Linux

$ version=`uname -a | cut -d" " –f3`

$ echo $version

2.6.11-1.1369_FC4

Attention, seul le canal de sortie standard est affecté à la variable.

Le canal d'erreur standard sort toujours vers l'écran.

(28)

Substitution de commande

Une commande cmd entourée par une paire de parenthèses () précédées d'un caractère $ est exécutée par le shell puis la chaîne $( cmd ) est remplacée par les résultats de la commande cmd écrits sur la sortie standard, c’est à dire

l’écran. Ces résultats peuvent alors être affectés à une variable ou bien servir à initialiser des paramètres de position.

Exemple :

$ pwd

/home/stagiaire => résultat écrit par pwd sur sa sortie standard

$ repert=$(pwd) => la chaîne /home/stagiaire remplace la chaîne

$(pwd)

$

$ echo mon repertoire est $repert mon repertoire est /home/stagiaire

$

$( cmd )

(29)

Les variables

Exercice1

Écrire un programme shell deuxfois qui affiche le message

"Entrez un mot : ", lit le mot saisi par l'utilisateur puis affiche ce mot deux fois sur la même ligne.

Exercices

Exercice2

Écrire un programme shell untrois qui demande à l'utilisateur de saisir une suite de mots constituée d'au moins trois mots et qui affiche sur la même ligne le premier et le troisième mot saisis.

Exercice3

Écrire un programme shell nbmots qui demande à l'utilisateur de saisir une suite quelconque de mots puis affiche le nombre de mots saisis.

Exercice4

Écrire un programme shell cp2fois prenant trois arguments : le premier désigne le nom du fichier dont on veut copier le contenu dans deux fichiers dont les noms sont passés comme deuxième et troisième arguments.

(30)

Les variables

Exercice5

En utilisant la substitution de commande, écrire un fichier shell mach affichant : "Ma machine courante est nomdelamachine"

Exercices

Exercice6

Écrire un programme shell taille qui prend un nom de fichier en argument et affiche sa taille

Exercice7

A l'aide de la commande unix date, écrire un programme shell jour qui affiche le jour courant du mois

Exercice8

a) Écrire un programme shell heure1 qui affiche l'heure sous la forme heures:minutes:secondes

(31)

Tests de conditions

test -z "variable" : zero, retour OK si la variable est vide (ex test -z "$a")

test -n "variable" : non zero, retour OK si la variable n'est pas vide (texte quelconque)

test "variable" = chaîne : OK si les deux chaînes sont identiques

test "variable" != chaîne : OK si les deux chaînes sont différentes

Tests sur chaîne

La commande test permet d'effectuer des tests de conditions. Le résultat est récupérable par la variable $? (code retour). Si ce résultat est 0 alors la

condition est réalisée.

Exemple :

$ a=

$ test -z "$a" ; echo $?

0

$ test -n "$a" ; echo $?

1

$ a=omar

$ test "$a" = omar ; echo $?

0

(32)

Tests de conditions

Les chaînes à comparer sont converties en valeurs numériques. La syntaxe est : test valeur1 option valeur2

et les options sont les suivantes :

Option Rôle

-eq Equal : égal

-ne Not Equal : différent

-lt Less than : inférieur

-gt Greater than : supérieur

-le Less or equal : inférieur ou égal -ge Greater or equal : supérieur ou égal

Tests sur valeurs numériques

Exemple :

$ a=10

$ b=20

$ test "$a" -ne "$b" ; echo $?

0

$ test "$a" -ge "$b" ; echo $?

1

(33)

Tests de conditions

La syntaxe est : test option nom_fichier et les options sont les suivantes :

Option Rôle

-f Fichier normal

-d Un répertoire

-c Fichier en mode caractère

-b Fichier en mode bloc

-r Autorisation en lecture

-w Autorisation en écriture

-x Autorisation en exécution

-s Fichier non vide (au moins un caractère)

-e Le fichier existe

-L Le fichier est un lien symbolique -u Le fichier existe, SUID-Bit positionné -g Le fichier existe SGID-Bit positionné

Tests sur les fichiers

(34)

Tests de conditions

Exemple :

$ ls -l

-rw-r--r-- 1 oracle system 1392 Aug 14 15:55 dump.log

lrwxrwxrwx 1 oracle system 4 Aug 14 15:21 lien_fic1 -> fic1 lrwxrwxrwx 1 oracle system 4 Aug 14 15:21 lien_fic2 -> fic2 -rw-r--r-- 1 oracle system 234 Aug 16 12:20 liste1

-rw-r--r-- 1 oracle system 234 Aug 13 10:06 liste2 -rwxr--r-- 1 oracle system 288 Aug 19 09:05 param.sh -rwxr--r-- 1 oracle system 430 Aug 19 09:09 param2.sh -rwxr--r-- 1 oracle system 292 Aug 19 10:57 param3.sh drwxr-xr-x 2 oracle system 8192 Aug 19 12:09 rep1

$ test -f lien_fic1 ; echo $?

1

$ test -x dump.log ; echo $?

1

$ test -d rep1 ; echo $?

Tests sur les fichiers

(35)

Tests de conditions

On peut effectuer plusieurs tests avec une seule instruction. Les options de combinaisons sont les mêmes que pour la commande find.

Critère Action

---

-a AND, ET logique

-o OR, OU logique

! NOT, NON logique

Tests combinés par critères ET OU NON

Exemple :

$ test -d "rep1" -a -w "rep1" && echo "rep1: repertoire, droit en ecriture"

rep1: repertoire, droit en ecriture

$ test ! -d "rep1" && echo "rep1 n’est pas un repertoire"

(36)

Tests de conditions

Le mot test peut être remplacé par les crochets ouverts et fermés « [...] ».

Il faut respecter un espace après et avant les crochets.

Syntaxe allégée

Exemple :

$ [ "$a" -lt "$b" ] && echo "$a est inferieur a $b"

10 est inferieur a 20

(37)

Tests de conditions

Une nouvelle commande permet des tests étendus et généralement plus performants, par l'utilisation des doubles-crochets « [[...]] ».

$ test –f fich[ -f fich ][[ -f fich ]]

Il existe quelques différences entre la commande test (ou []) et la nouvelle

Les caractères spéciaux (métacaractères) de recherche de fichiers ne sont pas interprétés.

-a et -o (ET et OU) sont remplacés par « && » et « || ».

Tests étendus

Exemple :

$ [[ -d "rep1" && -r "rep1" ]] && echo "rep1 : repertoire avec droits write"

(38)

Opérateurs && et || sur les codes de retour

Les caractères « && » et « || » permettent d'effectuer une exécution conditionnelle.

commande1 && commande2 commande1 || commande2

La commande située après « && » sera exécutée uniquement si la

commande précédente a retourné 0 (réussite). La commande située après

« || » ne sera exécutée que si la commande précédente a retourné autre chose que 0.

Exemple :

$ rm toto || echo "toto non efface"

rm: ne peut enlever `toto': Aucun fichier ou répertoire de ce type toto non efface

(39)

Entiers et expressions arithmétiques

Expressions arithmétiques habituelles évaluées à l'aide de

expr (révolue),

let (moderne et fait pour plusieurs expressions)

((…)) pour une seule expression

Exemple

$ expr $a + 1

Affiche la valeur de a incrémenté de 1

$ let a=a+1 b=2*a/3

Incrémente a de 1 et affecte à b la valeur 2a/3 Pas d'espace dans les expressions

$ ((y = 2 * x +3))

Affecte à y la valeur de l'expression 2x+3

(40)

Entiers et expressions arithmétiques

Arithmétiques :

() pour fixer l'ordre d'évaluation, ! Négation, * multiplication, / quotient, % modulo, + addition, - soustraction,

a++, a-- post-incrémentation, post-décrémentation ++a, --a pré-incrémentation, pré-décrémentation

Booléens :

<=, >=, <, >, == (égalité), != (différent), && (et logique),

|| (ou logique)

Affectation :

= (affectation simple)

Opérateurs identiques à ceux du langage C :

(41)

Entiers et expressions arithmétiques

Cette commande interne est utilisée pour effectuer des opérations arithmétiques.

Syntaxe : (( expr_arith ))

Son fonctionnement est le suivant : expr_arith est évaluée ; si cette

évaluation donne une valeur différente de 0, alors le code de retour de la commande interne (( est égal à 0 sinon le code de retour est égal à 1.

Commande interne ((

Exemple :

$ ((1-5 )) => la valeur de l'expression arithmétique est égale à -4 donc le code de retour de (( est égal à 0

$ echo $?

0

$ (( 5-5 )) => la valeur de l'expression arithmétique est 0, donc le code de retour de (( est égal à 1

$ echo $?

1

(42)

Entiers et expressions arithmétiques

Il est inutile d'utiliser le caractère de substitution $ devant le nom d'une variable car il n'y a pas d'ambiguïté dans l'interprétation ; par contre,

lorsqu'une expression contient des paramètres de position, le caractère $ doit être utilisé.

Commande interne ((

Exemple :

$ declare -i a=2 b

$ (( b = a + 7 ))

$ echo $b 9

$ date

jeudi 21 décembre 2006, 19:41:42 (UTC+0100)

$

$ set $(date)

$

$ (( b = $2 +1 )) => incrémentation du jour courant

$

$ echo $b 22

(43)

Entiers et expressions arithmétiques

La commande interne (( expr_arith )) n'affiche pas sur la sortie standard la valeur de l'expression arithmétique expr_arith.

Pour obtenir la valeur de l'expression arithmétique, on utilise la syntaxe :

$(( expr_arith ))

Valeur d'une expression arithmétique

Exemple :

$echo $(( 7 * 2 )) 14

$echo $(( a= 2*8 )) 16

$echo $(( 7 < 10 )) 1

(44)

Entiers et expressions arithmétiques

La commande expr permet d'effectuer des calculs sur des valeurs

numériques, des comparaisons, et de la recherche dans des chaînes de texte.

Commande expr

Exemple :

$ expr 7 + 3 10

$ expr 7 \* 3 21

$ a=`expr 13 – 10`

$ echo $a 3

(45)

Entiers et expressions arithmétiques

On peut faire des calculs en utilisant l'instruction "let".

Syntaxe : let "expr_arith"

Commande let

Exemple :

$ let "b=12+3"

$ echo $b 15

(46)

Entiers et expressions arithmétiques

Pour définir et initialiser une ou plusieurs variables de type entier, on utilise la syntaxe suivante : (même syntaxe avec la commande typeset )

declare -i nom[=expr_arith] nom[=expr_arith] ...

L'avantage est qu'il devient possible d'effectuer des calculs et des comparaisons sans passer par expr. La commande let ou « ((...)) » permet des calcules sur variables.

Pour que la valeur d’une variable entière ne soit pas accidentellement modifiée après qu’elle ait été initialisée, il suffit d’ajouter l’attribut r.

pour connaître toutes les variables entières définies, il suffit d’utiliser la commande declare -i

Variables de type entier

(47)

Entiers et expressions arithmétiques

Variables de type entier

Exemples :

$ declare -i x=35 => définition et initialisation de la variable entière x

$ declare -i v w => définition des variables entières v et w

$ v=12 => initialisation de v par affectation

$ read w

34 => initialisation de w par lecture

$declare -ir a=-6 => seule la consultation est autorisée !

$ typeset -i resultat

$ resultat=6*7

$ echo $resultat 42

$ resultat=resultat*3 126

$ resultat=Erreur Erreur: bad number

(48)

Délai d'attente

La commande sleep permet d'attendre le nombre de secondes indiqués.

Le script est interrompu durant ce temps. Le nombre de secondes et un entier compris entre 0 et 4 milliards (136 ans).

Commande sleep

Exemple :

$ sleep 10 ; date

(49)

Structures de contrôle

La structure if then else fi 'est une structure de contrôle conditionnelle.

if <commandes_condition>

then

<commandes exécutées si condition réalisée>

else

<commandes exécutées si dernière condition pas réalisée>

fi

On peut aussi préciser le elif, en fait un else if. Si la dernière condition n'est pas réalisée on en teste une nouvelle.

Le fonctionnement est le suivant : commandes_condition est exécutée ; si son code de retour est égal à 0, alors la branche then est exécutée sinon c'est la branche elif ou la branche else qui est exécutée, si elle existe.

Structure de contrôle conditionnelle : if ... then ... else

(50)

Structures de contrôle

Structure de contrôle conditionnelle : if ... then ... else

Exemples :

programme rm1

---

#!/bin/bash

if rm $1 2>/dev/null

then echo $1 a ete supprime

else echo $1 n\'a pas ete supprime fi

programme affic

---

#!/bin/bash if [[ -f $1 ]]

then

echo $1 : fichier ordinaire cat $1

elif [[ -d $1 ]]

then

echo $1 : repertoire ls $1

else

echo $1 : type non traite

(51)

Structures de contrôle

Choix multiples case

La commande case esac permet de vérifier le contenu d'une variable ou d'un résultat de manière multiple.

Syntaxe:

Case valeur in

Expr1) commandes ;;

Expr2) commande ;;

….

Esac

Expr est soit un simple texte, soit composé de caractères spéciaux.

Chaque bloc de commandes lié à Expr doit se terminer par deux points- virgules.

Dès que le Expr est vérifié, le bloc de commandes correspondant est exécuté.

L'étoile en dernière position (chaîne variable) est l'action par défaut si aucun critère n'est vérifié.

(52)

Structures de contrôle

Choix multiples case

Exemples :

Read langue Case $langue in

Français) echo

"bonjour" ;;

Anglais) echo "hello" ;;

Espagnol) echo

"buenos dias" ;;

*) echo "erreur de choix" ;;

esac

for var in * do

echo "$var \c"

type_fic=`ls -ld $var | cut -c1`

case $type_fic in

-) echo "Fichier normal" ;;

d) echo "Repertoire" ;;

b) echo "mode bloc" ;;

l) echo "lien symbolique" ;;

c) echo "mode caractere" ;;

*) echo "autre" ;;

esac done

(53)

Structures de contrôle

Choix multiples case

Expr peut être construit à l’aide des caractères et expressions génériques de bash. Dans ce contexte, le symbole | signifie OU.

Exemple2 :

read –p ″Entrez votre réponse : ″ rep case $rep in

o|O ) echo OUI ;;

*) echo Indefini esac

(54)

Structures de contrôle

Choix multiples case

Exemple3 :

#!/bin/bash if [ $# -ne 0 ] then

echo "$# parametres en ligne de commande"

else

echo "Aucun parametre"

fi

case $1 in

a*) echo "Commence par a" ;;

b*) echo "Commence par b" ;;

fic[123]) echo "fic1 fic2 ou fic3" ;;

*) echo "Commence par n'importe" ;;

esac

(55)

Structures de contrôle

L'itération for possède plusieurs syntaxes dont les deux plus générales sont :

Première forme : for var do

suite_de_commandes done

Lorsque cette syntaxe est utilisée, la variable var prend successivement la valeur de chaque paramètre de position initialisé.

Boucle for

Exemple : programme for_arg

#!/bin/bash for i

do

echo $i

echo "Passage a l'argument suivant ..."

done

$ for_arg un deux un

Passage a l'argument suivant ...

deux

Passage a l'argument suivant ...

(56)

Structures de contrôle

Deuxième forme :

for var in liste_mots

do

suite_de_commandes done

La variable var prend successivement la valeur de chaque mot de liste_mots.

Boucle for

Exemple : programme for_liste

#!/bin/bash for a in toto tata do

echo $a done

$ for_liste toto

tata

(57)

Structures de contrôle

Deuxième forme :

Si liste_mots contient des substitutions, elles sont préalablement traitées par bash.

Boucle for

Exemple : programme affich.ls

#!/bin/bash

for a in tmp $(pwd) do

echo “ --- $i ---"

ls $i done

Exemple : programme affich.user

#!/bin/bash

echo "Liste des utilisateurs dans /etc/passwd"

for var in `cat /etc/passwd | cut -d: -f1`

do

echo "$var"

done

(58)

Structures de contrôle

Bash a introduit une nouvelle structure for adaptée aux traitements des

expressions arithmétiques, itération issue du langage C. Elle fonctionne comme cette dernière.

Syntaxe :

for (( expr_arith1 ; expr_arith2 ; expr_arith3 )) do

suite_cmd done

Structure for pour les expressions arithmétiques

expr_arith1 : est l'expression arithmétique d'initialisation.

expr_arith2 : est la condition d’arrêt de l’itération.

expr_arith3 : est l’expression arithmétique qui fixe le pas d’incrémentation ou de décrémentation.

(59)

Structures de contrôle

Structure for pour les expressions arithmétiques

Exemples :

#!/bin/bash declare -i x

for (( x=0 ; x<5 ; x++ )) do

echo $(( x*2 )) done

#!/bin/bash declare -i x y

for (( x=1,y=10 ; x<4 ; x++,y-- )) do

echo $(( x*y )) done

(60)

Structures de contrôle

La commande while permet une boucle conditionnelle « tant que ».

Tant que la condition est réalisée, le bloc de commande est exécuté.

On sort si la condition n'est plus valable

Syntaxe :

while condition do

commandes done

Ou

while

bloc d'instructions formant la condition do

commandes done

La boucle while

(61)

Structures de contrôle

La boucle while

Exemple1 #!/bin/bash

while who | grep etudiant >/dev/null do

echo ″l’utilisateur etudiant est encore connecte″

sleep 5 done

l’utilisateur etudiant est encore connecte

Exemple2 #!/bin/bash while

echo "Chaine ? \c"

read nom [ -z "$nom" ] do

echo "ERREUR : pas de saisie"

done

echo "Vous avez saisi : $nom"

(62)

Structures de contrôle

La commande until permet une boucle conditionnelle « jusqu'à ».

Dès que la condition est réalisée, on sort de la boucle.

Syntaxe :

until condition do

commandes done

Ou

until

bloc d'instructions formant la condition do

commandes done

La boucle until

(63)

Structures de contrôle

La commande seq permet de sortir une séquence de nombres, avec un intervalle éventuel.

Syntaxe :

seq [debut] [increment] fin

La commande seq

$ seq 5 1

2 3 4 5

Exemples :

$ seq -2 3 -2

-1 0 1 2 3

$ seq 0 2 10 0

2 4 6 8 10

(64)

Structures de contrôle

La commande break permet d'interrompre une boucle. Dans ce cas le script continue après la commande done. Elle peut prendre un argument numérique indiquant le nombre de boucles à sauter, dans le cadre de boucles imbriquées (rapidement illisible).

La commande continue permet de relancer une boucle et d'effectuer un nouveau passage. Elle peut prendre un argument numérique indiquant le nombre de boucles à relancer (on remonte de n boucles). Le script

redémarre à la commande do.

break et continue

while true do

echo "Chaine ? \c"

read a if [ -z "$a" ] then

break

(65)

Structures de contrôle

break et continue

#!/bin/bash somme=0

#boucle infinie while true do

echo "Entrez un nombre : \c"

#saisie d'un nombre if read nombre

then

#si la saisie est incorrect, on remonte a la boucle if [[ "$nombre" != ?([+ -]) + ([0-9]) ]]

then

echo "la valeur saisie n'est pas un nombre"

continue fi

somme='expr $somme + $nombre' else

# l'utilisateur a saisie ^d : sortie de la boucle break

fi done

#Affichage du resultat

echo "\n la somme est : $somme\c"

(66)

Structures de contrôle

La commande select permet de créer des menus simples, avec

sélection par numéro. La saisie s'effectue au clavier avec le prompt de la variable PS3. Si la valeur saisie est incorrecte, une boucle

s'effectue et le menu s'affiche à nouveau. Pour sortir d'un select il faut utiliser un break.

select variable in liste_contenu do

traitement done

Si in liste_contenu n'est pas précisé, se sont les paramètres de position qui sont utilisés et affichés.

Commande select

(67)

Structures de contrôle

Exemple

!#/bin/bash

PS3="Votre choix :"

echo "Quelle donnee ?"

select reponse in Jules Romain Francois quitte do

if [[ "$reponse" = "quitte" ]]

then

break fi

echo "Vous avez choisi $reponse"

done

echo "Au revoir."

Commande select

$ ./select.sh Quelle donnee ? 1) Jules

2) Romain 3) Francois 4) quitte

Votre choix :1

Vous avez choisi Jules Votre choix :3

Vous avez choisi Francois Votre choix :4

Au revoir.

(68)

Structures de contrôle

Le Bash ne proposait pas de mécanisme simple pour lire par exemple un fichier ligne à ligne. Il permet d'envoyer le résultat d'une commande dans un tube avec la syntaxe « |& » et de récupérer ce résultat avec la commande read -p.

commande |&

read -p variable

read et |&

Exemple

!#/bin/bash

typeset -i compteur compteur=1

cat liste |&

while read -p ligne do

echo "$compteur\t $ligne"

(69)

Programmation shell

MERCI DE VOTRE ATTENTION

Références

Documents relatifs

[r]

Voir aussi les références du site en matière orthotypographique (notamment pour les ouvrages cités) dans la bibliographie et la sitographie.. Jacques Poitou, professeur à

Quand le voisement s’arrête légèrement avant le relâchement de la consonne de coda et reprend après le relâchement pour un vocoïde (5 cas observés dans

La difficulté réside ici non dans le fait de constater encore les différences et d’apprendre à vivre avec (d’ailleurs, si la différence est une richesse, alors il faut la

Le gouvernement du Canada est donc résolu à continuer de collaborer avec les autres gouvernements, les organisations non gouvernementales et le secteur privé afin d’améliorer la

asseoir à cette table qui ne lui plaît pas, racontant une histoire com- pliquée de plaques (exactement comme si, revenant du marché, elle rapportait une dispute entre elle

Conduite de l’essai, mesures, prélèvements, analyses Quatre lots expérimentaux étaient constitués le jour du sevrage, en allouant les aliments expérimentaux dans un

Je peux utiliser le dictionnaire pour connaître l'orthographe d'un mot, pour trouver sa définition ou pour savoir à quelle classe grammaticale il appartient. Dans le dictionnaire,