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/'