Vous êtes sur la page 1sur 27

SHELL SCRIPTING

Scripting avancé
LES TABLEAUX
Qu'est-ce qu'un tableau ?
• En bash il est possible de créer des tableaux à une
dimension.

• Imaginez un tableau excel pour lequel vous associer à


chaque colonne une valeur différente :

VARIABLE 0
1 2
1 3
2 4
3 5
4
Valeur1
Valeur0 Valeur2
Valeur1 Valeur3
Valeur2 Valeur4
Valeur3 valeur5
valeur4
La syntaxe
• Pour bien comprendre la syntaxe reprenons le tableau
précédent :
VARIABLE 0 1 2 3 4
Valeur0 Valeur1 Valeur2 Valeur3 valeur4

• Pour construire le tableau suivant on a utilisé la syntaxe :


VARIABLE[0]="Valeur0"
VARIABLE[1]="Valeur1"
VARIABLE[2]="Valeur2"
VARIABLE[3]="Valeur3"
VARIABLE[4]="Valeur4"

VARIABLE=(valeur0 valeur1 valeur2 valeur3 valeur4)


Quelques règles
• L'indice que l'on spécifie entre les crochets doit être
obligatoirement positif ou nul.

• Rien ne vous oblige à remplir le tableau pour la valeur "n"


avant de le remplir pour la valeur "n+1"

• En associant une valeur à un numéro, on écrase ce que


contenait potentiellement ce numéro.

• Pour accéder à la valeur de la variable :


VARIABLE=(valeur0 valeur1 valeur2 valeur3 valeur4)

echo ${VARIABLE[1]}
valeur1
Utilisation des wildcards
• On peut remplacer l'indice qui est situé entre crochets par
des wildcards.

• * ou @: Le shell va concaténer tous les éléments du


tableau en une seule chaîne de caractère.
VARIABLE=(valeur0 valeur1 valeur2 valeur3 valeur4)

echo ${VARIABLE[*]}
valeur0 valeur1 valeur2 valeur3 valeur4


COMMANDE READ
Avancée
Utilisation du read pour les tableaux
• Il est tout à fait possible d'utiliser la commande read pour
stocker des valeurs dans un tableau.
read –a NOM_DU_TABLEAU

• Les valeurs séparées par un espace seront stockées


dans l'ordre dans le tableau.
read –a NOM_DU_TABLEAU
valeur0 valeur1 valeur2

echo ${NOM_DU_TABLEAU[0]}
valeur0
Utilisation du read pour les tableaux (2)
• On peut décider d'afficher toutes les valeurs contenues
dans le tableau grâce au caractère * ou @ :

read –a NOM_DU_TABLEAU
valeur0 valeur1 valeur2

echo ${NOM_DU_TABLEAU[*]}
valeur0 valeur1 valeur2

echo ${NOM_DU_TABLEAU[@]}
valeur0 valeur1 valeur2
Et si on ne spécifie pas de variables ?
• Lorsque l'on exécute la commande read, mais qu'on ne
spécifie pas de variables à associer au contenu rentré par
l'utilisateur, la chaîne saisie sera stockée dans une
variable interne appelée $REPLY
read
valeur0

echo $REPLY
valeur0
Mettre une variable en lecture seule
• On peut utiliser la commande readonly pour verrouiller contre
toute modification et suppression la variable spécifiée.

• Une fois qu'elle est verrouillée, seule la mort du processus qui


l'utilise la fera disparaître.
debian:/home/jordan# readonly variable1
debian:/home/jordan# read variable1
Valeur1

bash: var1 : variable en lecture seule

• La commande readonly tapée seule, permet d'afficher toutes


les variables en lecture seule.
ACTIONS AVANCÉES SUR
LES VARIABLES
Supprimer une variable
• La commande unset permet de supprimer la variable à
condition que celle-ci ne soit pas protégée par une
instruction readonly.

• Attention, il ne s'agit pas de supprimer la valeur associée


à la variable, mais bien de supprimer la variable elle-
même (en libérant l'espace mémoire lui étant affecté).
debian:/home/jordan# VARIABLE1="Jordan"
debian:/home/jordan# echo $VARIABLE1
Jordan

debian:/home/jordan# unset VARIABLE1


debian:/home/jordan# echo $VARIABLE1
Utilisation de l'export
• Pour qu'un processus "père" puisse faire connaître une
variable à son processus "fils", il doit l'exporter avec la
commande export.
• Script : script_export.sh
#!/bin/bash
echo "La variable prenom a pour valeur : $PRENOM"

debian:/home/jordan# PRENOM="Jordan"
debian:/home/jordan# ./script_export.sh
La variable prenom a pour valeur

debian:/home/jordan# export PRENOM


debian:/home/jordan# ./script_export.sh
La variable prenom a pour valeur Jordan
Préciser le type de variable
• En Scripting Shell, comme dans la plupart des autres
langages, il est possible de spécifier le type de variable
que l'on déclare grâce à la commande typeset ou
declare

• typeset –a NOM_DE_LA_VARIABLE : tableau


• typeset –i NOM_DE_LA_VARIABLE : entier
• typeset –r NOM_DE_LA_VARIABLE : readonly
• typeset –x NOM_DE_LA_VARIABLE : export
Les variables prédéfinies
• $HOME : Répertoire personnel de l'utilisateur
• $PWD : Répertoire courant
• $LOGNAME : Nom de l'utilisateur
• $PS1 : Prompt principal
• $REPLY : Chaîne saisie par l'utilisateur si la commande
read n'a pas été utilisée avec un argument.
• $RANDOM : nombre aléatoire compris entre 0 et 32767
• $$ : numéro du processus actuel
Utilisation de la commande set et des IFS
• Lorsque des instructions avec la commande set sont
effectuées, le Shell parvient à isoler et stocker les
différentes valeurs dans les variables de positionnement.

• C'est la variable IFS qui contient les caractères devant


être utilisés pour la séparation des différentes valeurs (par
défaut il s'agit de l'espace)
#!/bin/bash
CHAINE="Bonjour:je:suis:Jordan"
IFS=:
set $CHAINE
echo $2

./script.sh
je
Arithmétique sur les variables
• La commande expr réalise ls opérations mathématiques
demandées :
• + : addition
• - : soustraction
• \* : multiplication
• / : division euclidienne
• % : modulo

• Syntaxe :
i=5
j=`expr $i + 4`

echo $j
9
Découper des lignes avec cut
• La commande cut permet de sélectionner un champ ou
un caractère précis dans une ligne. Elle prend différentes
options :
• -f : découpe la ligne suivant le caractère tabulation
• -d : spécifie un autre caractère de séparation
• -s : ignore les lignes ne contenant pas de caractère de séparation

Affichage du début de chaque ligne jusqu'à trouver un ":"


cat /etc/passwd | cut –d: -f1

Affichage des deux premiers champs de chaque ligne en


utilisant : comme délimitateur
cat /etc/passwd | cut –d: -f1-2
LA COMMANDE SED
La commande sed
• Il s'agit d'un éditeur de flux de données, qui permet de
modifier spécifiquement ligne par ligne, des éléments de
la sortie d'une commande.

• Il est possible d'utiliser sed de deux manières :


• Appliquer la commande sed sur le flux d'entrée et récupérer le flux
de sortie.
• Appliquer la commande sed directement sur un fichier passé en
entrée.
La commande sed (2)
• En plus des options et du fameux flux d'entrée, sed utilise
également un script qui contiendra l'ensemble des actions
qu'il devra exécuter.
• Nous pouvons écrire directement le script dans la ligne de
commande grâce à l'option –e (chaque commande est séparée de
la suivante par des ;)
• Nous pouvons passer à la commande sed un fichier contenant le
script en question grâce à l'option -f
Exemple d'un fichier texte.txt

Bonjour je m'appelle Jordan.


Il s'agit de la deuxième ligne du fichier.

On peut y faire figurer des numéros : 3 4 et 5


#On peut également y mettre des commentaires
Faire des lignes avec des caractères du type
root:jordan:assouline

Ligne numéro 8.
Utilisation de sed (suppression)
• Afficher toutes les lignes exceptée la ligne numéro 8 :

sed '8 d' texte.txt

• Afficher toutes les lignes exceptées la ligne 8 et 2 :


sed '2 d; 8 d' texte.txt

• Afficher toutes les lignes exceptées la ligne 1 à 3 :

sed '1,3 d' texte.txt


Utilisation de sed (suppression 2)
• Pour utiliser les regex, il faut encadrer le motif par des /.
• Par exemple pour supprimer toutes les lignes commençant par # :

sed '/^#/ d' texte.txt

• Le ^ signifiant : début de ligne

• On peut aussi utiliser un interval en séparant les deux


motifs par une virgule.
• Par exemple pour supprimer toutes les lignes entre Bonjour et
assouline :

sed '/Bonjour/,/assouline/ d' texte.txt
Utilisation de sed (substitution)
• Pour effectuer une substitution il faut utiliser la syntaxe :

sed 's/element_a_substituer/element_substituant/'

• Substituer ":" par un espace au premier motif rencontré :

sed 's/:/ /'

• Substituer ":" par un espace sur tous les motifs rencontrés :

sed 's/element_a_substituer/element_substituant/g'
Utilisation de sed (Translittération)
• Pour effectuer une translittération il faut utiliser la syntaxe :

sed 'y/liste_a_translitterer/liste_de_translittération/'

• Translittérer les e accentués par des e classiques

sed 'y/éè/ee/'

Vous aimerez peut-être aussi