07-Script Shell - Cours
07-Script Shell - Cours
INF1070
Utilisation et administration des systèmes informatiques
Hiver 2019
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 1 / 80
Plan
1 Programmes et scripts
2 Script shell
4 Plus de redirections
5 Développement et substitutions
6 Paramètres et variables
7 Substitution de commandes
8 Code de retour
9 Structures de contrôle
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 2 / 80
Programmes et scripts
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 3 / 80
Programme
Programmes scripts
• Programme en langage de script
• Sous forme textuelle
• Exécutés par un interpréteur (un autre programme)
Script shell → Programme destiné à être interprété par le shell
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 4 / 80
Langages de script
Spectre large
• Spécifique à un domaine (DSL)
• Généraliste
• Langage glue / langage d’extension
Environnement inclus
• Interprétés plutôt que compilés
• L’efficacité n’est pas un objectif
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 5 / 80
Langages de script plus ou moins populaires
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 6 / 80
Langages de script plus ou moins populaires
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 6 / 80
Programmes sous Unix
Droits nécessaires
• x pour les programmes binaires
• x et r pour les programmes scripts
Question
• Peut-on exécuter un lien symbolique ?
• Peut-on exécuter un programme sans les droits x (mais avec r) ?
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 7 / 80
Fichiers accessoires
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 8 / 80
Exécuter un programme ⋆
Chemin absolu ou relatif
Avec au moins un slash « / »
• /opt/INF1070/hello
• script/hello
• ./hello → exécute un programme du répertoire courant
Nom simple
Le nom d’un fichier d’un des répertoires d’exécutables
Habituellement au moins /bin, /usr/bin et /usr/local/bin
• type affiche des informations sur le type de commande (POSIX)
• which localise une commande dans l’environnement courant
• whereis recherche une commande à d’autres endroits habituels
• echo "$PATH" pour voir les répertoires d’exécutables (les détails
plus tard)
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 9 / 80
Script ou binaire ?
• /usr/bin/ts (timestamp) horodate l’entrée standard (extra)
• /usr/bin/chromium navigateur web de Google (extra)
• /usr/bin/ldd lister les bibliothèques partagées nécessaires (extra)
Tester avec file ou ouvrir avec vim
Shebang
Tout fichier texte lisible et exécutable (r-x) peut être exécuté
• Les premiers caractères sont « #! » (shebang)
• Ça indique le chemin absolu de l’interpréteur à utiliser
• Sans shebang, le défaut est souvent /bin/sh
$ cat hello
#!/ bin/sh
echo Heeeeeellllloooooo !!!!!!
$ ./ hello
Heeeeeellllloooooo !!!!!!
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 10 / 80
Autres exécution de scripts
Script en ligne
Option sh -c exécute les instructions passées en argument
$ dash -c "echo hello | rev"
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 11 / 80
Script shell
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 12 / 80
Objectif du cours
• S’initier à la programmation shell
• Voir plusieurs fonctionnalités avancées du shell
Contenu
La suite décrit des fonctionnalités avancées et utiles du shell.
• Elles sont supportées par les shell POSIX (incluant dash et bash).
• Les extension spécifiques à bash (appelées bashismes) sont
signalées.
Bibliographie
De nombreuses fonctionnalités (et variations) ne sont pas décrites.
Pour une information plus complète, consultez
• bash
• Shell POSIX
• Advanced Bash-Scripting Guide (traduction en français)
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 13 / 80
Pourquoi programmer en shell ?
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 14 / 80
Automatisation
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 16 / 80
Exécution de scripts
# Dit « Bonjour »
echo Bonjour # Salut
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 17 / 80
Attention à l’échec
Quand une commande échoue le script continue (par défaut)
#!/ bin/sh
cd /tnp/ reterpoire
rm -rf *
echo "Tout est effacé !"
On exécute…
$ ./ efface
bash: cd: /tnp/ reterpoire : Aucun dossier de ce type
Tout est effacé !
$ ls -l
total 0
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 18 / 80
Attention à l’échec
Quand une commande échoue le script continue (par défaut)
#!/ bin/sh
cd /tnp/ reterpoire
rm -rf *
echo "Tout est effacé !"
On exécute…
$ ./ efface
bash: cd: /tnp/ reterpoire : Aucun dossier de ce type
Tout est effacé !
$ ls -l
total 0
Meilleure solution
#!/ bin/sh
rm -rf /tnp/ reterpoire /*
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 18 / 80
Groupes et séquences de commandes
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 19 / 80
Séquences de commandes
Le point virgule « ; » enchaîne les commandes
$ echo bonjour ;echo le monde
bonjour
le monde
Note
• L’esperluette « & » fonctionne comme « ; »
• Mais passe la commande en arrière-plan
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 20 / 80
Groupes de commandes
Attention
• () s’exécutent dans un sous-shell
• {} nécessitent
• un espace après le {
• un ; (ou équivalent) avant le }
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 21 / 80
Plus de redirections
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 22 / 80
Redirections de base (rappel)
• « > fichier » redirige la sortie standard en tronquant
• « >> fichier » redirige la sortie standard en ajoutant
• « < fichier » utilise fichier comme entrée standard
• « 2> fichier » redirige la sortie d’erreur
Le shell s’occupe
• D’ouvrir les fichiers
• De rapporter les problèmes d’ouverture
• En cas de problème, la commande n’est pas exécutée
$ cat fail
cat: fail: Aucun fichier ou dossier de ce type
$ cat < fail
bash: fail: Aucun fichier ou dossier de ce type
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 23 / 80
Redirections de base (rappel)
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 24 / 80
Redirections de base (rappel)
Question
Qu’affiche « head -n < /etc/passwd 1 » ?
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 24 / 80
Redirections de base (rappel)
Question
Qu’affiche « head -n < /etc/passwd 1 » ?
« root:x:0:0:root:/root:/bin/bash »
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 24 / 80
Duplication de redirection
Attention
L’ordre des redirections est important
$ ls /usr/bin/perl fail 2>&1 >liste
ls: impossible d' accéder à 'fail ': Aucun fichier
$ cat liste
/usr/bin/perl
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 25 / 80
Descripteurs de fichiers
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 26 / 80
Tubes et conduites (rappel)
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 27 / 80
Tubes et redirections
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 28 / 80
Questions de redirection
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 29 / 80
Questions de redirection
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 29 / 80
Questions de redirection
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 29 / 80
Questions de redirection
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 29 / 80
Questions de redirection
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 29 / 80
Duplication d’entrée standard
tee copie l’entrée standard vers des fichiers et vers la sortie standard
• -a, --append ajouter au fichier sans l’écraser
$ grep -x 'dr .*rd ' french | tee liste | wc -c
11
$ cat liste
dreyfusard
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 30 / 80
Document en ligne (Here document ou heredoc)
« <<délimiteur » permet de déclarer un document en ligne
• Après le le shell n’exécute pas la commande
• Les lignes suivantes sont lues et utilisée comme document
d’entrée
• Le document s’arrête quand une ligne délimiteur est lue
$ rev <<FIN
> ruojnob
> ednom el
> FIN
bonjour
le monde
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 31 / 80
Chaîne en ligne (bashisme)
Attention
Ceci est une extension bash
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 32 / 80
Développement et substitutions
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 33 / 80
Développement et substitutions
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 34 / 80
Développement des accolades (bashisme)
Bash accepte trois formes
• Liste: « x{a,b,c}y » → xay xby xcy
• Série: « a{1..5} » → a1 a2 a3 a4 a5
• Série et pas: « a{10..30..5} » → a10 a15 a20 a25 a30
Se combinent et s’imbriquent
$ echo f {1..3}.{ txt ,png}
f1.txt f1.png f2.txt f2.png f3.txt f3.png
$ mkdir -p \
velo /{ roue /{ jante ,rayon ,moyeu },selle , cadre /{ tube , fourche }}
Note
• Il a lieu avant tous les autres développements
• Ce n’est pas du glob
• C’est une extension bash
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 35 / 80
Paramètres et variables
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 36 / 80
Paramètres et compagnie
Paramètre positionnel
• Un paramètre avec un numéro, exemples « $1 » et « $3 »
• Pour récupérer les arguments
Paramètre spécial
• Un paramètre avec un caractère, exemples « $@ » et « $* »
• Pour des rôles spécifiques
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 37 / 80
Variables du shell ⋆
Attention
• Pas de « $ » lors de l’affectation
• Pas d’espaces autour du « = »
• Mettre des « " » pour éviter les mauvaises surprises
• Il n’y a pas de types de données, ce sont des chaînes
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 38 / 80
Split et glob ⋆
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 39 / 80
Exemple split-glob ⋆
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 40 / 80
Exemple split-glob ⋆
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 40 / 80
Exercice split-glob
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 41 / 80
Paramètres positionnels ⋆
• Permet de récupérer la valeur des arguments
• « $1 » est le premier argument, « $2 » le second, etc.
#!/ bin/sh
echo "Le premier argument est $1"
echo "Le second argument est $2"
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 42 / 80
Quelques paramètres spéciaux ⋆
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 43 / 80
Question des paramètres positionnels
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 44 / 80
La commande set
set affecte les options et paramètres positionnels (interne)
Réaffecte les paramètres positionnels
$ set A C D
$ echo "$* $2"
A C D C
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 45 / 80
Variables utilisées par le shell
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 46 / 80
Sous-interpréteur (subshell)
Le shell peut créer des sous-environnements locaux
• Conduites « | »
• Commandes en arrière plan « & »
• Groupes avec « () »
• Substitution « $() » et « <() »
Caractéristiques
• Chaque sous-interpréteur est un processus indépendant
• Les variables du shell sont héritées par copie
• Les modifications ne sont pas propagées au parent
→ Source de bogues subtils
$ { a=1; }; echo "$a"
$ (a=2; echo "$a ")
$ { a=3; echo "$a"; } &
$ a=4|a=5
$ echo $a
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 47 / 80
Variables d’environnement ⋆
Variables du shell
• Concept du shell
• Limitées au shell courant
Variables d’environnement
• Concept du système d’exploitation
• S’appliquent à tous les processus
• Propagées aux processus enfants (par défaut)
Le shell
• Permet de marquer certaines variable
• Elles seront exportées comme des variables d’environnement
dans les sous-processus
• Permet d’exécuter dans un environnement modifié
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 48 / 80
Exporter une variable
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 49 / 80
Affectations facultatives de variables
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 50 / 80
Plus sur la commande env
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 51 / 80
Substitution de commandes
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 52 / 80
Substitution de commandes ⋆
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 53 / 80
Guillemets simple et doubles (rappel)
• « ' » (guillemet simple, simple quote)
→ Force l’interprétation littérale jusqu’au prochain « ' »
• « " » (guillemets doubles, double quote)
→ Une version amoindrie de « ' »
→ Permet les caractères 3 spéciaux internes: « \ », « $ » et « ` »
Question
Qu’affichent
• cowsay "$(echo toto)"
• cowsay '$(echo toto)'
• cowsay $(echo toto)
• 'cowsay $(echo toto)'
• "cowsay $(echo toto)"
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 54 / 80
Substitution de commandes: split et glob
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 55 / 80
Substitution de commandes: split et glob
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 55 / 80
Substitution de commandes: split et glob
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 55 / 80
Substitution de commandes: split et glob
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 55 / 80
Explication
basename élimine le chemin d’accès et le suffixe d’un nom de fichier
$ pwd
/tmp/data/ ta
$ basename "$(pwd )"
ta
$ basename "/ tmp/data/ ta"
ta
$ basename $(pwd)
da
$ basename tmp/data/ ta
da
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 56 / 80
Question substitution de commandes
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 57 / 80
Substitution de processus (bashisme)
« <(cmd) » ou « >(cmd) »
• Exécute la commande cmd
• Redirige sa sortie (ou son entrée) vers un tube
• Substitue par le fichier de l’autre bout du tube
• C’est un peu magique…
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 58 / 80
Substitution de processus
$ cat fruits1 .txt
banane
orange
$ cat fruits2 .txt
orange
kiwi
banane
$ diff fruits1 .txt fruits2 .txt
1d0
< banane
2a2 ,3
> kiwi
> banane
$ diff <(sort fruits1 .txt) <(sort fruits2 .txt)
1a2
> kiwi
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 59 / 80
Développement mathématique
« $((expr)) » évalue une expression mathématique
$ echo $ ((1+1))
2
$ x=10
$ echo $((x+1))
11
• Que des nombres entiers
• La plupart des opérateurs du C (≈ Java) sont reconnus
$ echo $ ((1+2*3%4))
3
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 60 / 80
Code de retour
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 61 / 80
Code de retour des commandes ⋆
Chaque commande exécutée a un code de retour (ou code de
sortie)
Convention
• 0 tout s’est bien passé: succès
• Une autre valeur signifie un problème: échec
• Voir le manuel des commandes pour les détails
Le paramètre spécial « $? » contient le code de retour de la dernière
commande
$ wc -l /etc/ passwd
49 /etc/ passwd
$ echo "$?"
0
$ wc -l fail
wc: fail: Aucun fichier ou dossier de ce type
$ echo "$?"
1
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 62 / 80
Fin des scripts
Terminaison du script
• La fin du fichier script est atteinte
• La commande exit est exécutée
Code de retour
• Peut être indiqué lors du exit
• Sinon, c’est celui de la dernière commande exécutée
Question
Quel est le code de retour du script suivant?
#!/ bin/sh
cat epic.fail
echo "Au revoir "
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 63 / 80
Vrai et faux
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 64 / 80
Liste conditionnelle de commandes
« && » et « || » chaînent les commandes en fonction de leur retour
Et « && »
Exécute la seconde commande ssi la première réussit
$ cd toto && ls
bash: cd: toto: Aucun fichier ou dossier de ce type
Ou « || »
Exécute la seconde commande ssi la première échoue
$ cd toto || echo "tant pis"
bash: cd: toto: Aucun fichier ou dossier de ce type
tant pis
Attention
• Ne pas confondre « && », « & », « || » et « | »
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 65 / 80
Structures de contrôle
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 66 / 80
Structures de contrôle
Consignes
• Respectez les bonnes pratiques
• Évitez l’utilisation superflues de structures de contrôles
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 67 / 80
Construction if
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 68 / 80
Exemple de if
Qu’affiche le programme suivant?
#!/ bin/sh
mot= pâtisserie
if grep -q -e "$mot" -x /usr/ share /dict /*; then
echo "C'est du gâteau "
else
echo "C'est pas d'la tarte "
fi
Note de style
• On aligne if, elif, else et fi
• On met le then a la fin des lignes (après le ;)
• On indente le corps des then et else
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 69 / 80
Des meilleurs tests
test teste des expressions
• L’utilitaire « [ » est similaire à test
• test et « [ » sont souvent des commandes internes
• « [ » nécessite un argument « ] » final (pour faire joli)
Exemples
$ test -e /etc/ passwd ; echo $?
0
$ [ -e /etc/pas -ce -word ]; echo $?
1
$ test toto = tata; echo $?
1
Attention
• Mettre des espaces autour des « [ » et « ] »
• Bien échapper les variables
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 70 / 80
Opérateurs de test des fichiers
• « -e 𝑓 » le fichier 𝑓 existe
• « -f 𝑓 » le fichier 𝑓 existe et est régulier
• « -d 𝑓 » le fichier 𝑓 existe et est un répertoire
• « -r 𝑓 » le fichier 𝑓 existe et est lisible
• « -s 𝑓 » le fichier 𝑓 existe et n’est pas vide
→ Plusieurs autres en fonction des métadonnées des fichiers
Exemple d’utilisation
• Tester l’existence et la validité des arguments
if [ -e " $output " ]; then
echo " Erreur : $output existe déjà" >&2
exit 1
fi
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 71 / 80
Opérateurs de test des chaînes
• « -z 𝑠 » la chaîne 𝑠 est de longueur nulle (chaîne vide)
• « -n 𝑠 » la chaîne 𝑠 est de longueur non nulle (chaîne non vide)
• « 𝑠 = 𝑠′ » les chaînes 𝑠 et 𝑠′ sont identiques
• « 𝑠 != 𝑠′ » les chaînes 𝑠 et 𝑠′ sont différentes
Exemple d’utilisation
• Comparer des variables
if [ -z " $output " ]; then
# Pas d' output demandé , on termine là
exit 0
fi
Attention
• L’opérateur d’égalité est « = » (et pas « == »)
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 72 / 80
Opérateurs de test numériques
• « 𝑛 -eq 𝑛′ » les nombres entiers 𝑛 et 𝑛′ sont égaux (equal)
• « 𝑛 -ne 𝑛′ » 𝑛 et 𝑛′ sont différents (not equal)
• « 𝑛 -gt 𝑛′ » 𝑛 est strictement plus grand que 𝑛′ (greater than)
• « 𝑛 -ge 𝑛′ » 𝑛 est plus grand ou égal 𝑛′ (greater or equal)
• « 𝑛 -lt 𝑛′ » 𝑛 est strictement plus petit que 𝑛′ (less than)
• « 𝑛 -le 𝑛′ » 𝑛 est plus petit ou égal 𝑛′ (less or equal)
Exemple d’utilisation
• Compter des trucs
if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then
echo "usage : outil IN OUT [ EXTRA ]" >&2
exit 1
fi
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 73 / 80
De meilleurs tests encore (bashisme)
« [[ ]] » construction spéciale de bash
• Pas besoin de protéger les variable (pas de split et glob)
• « && » et « || » connecteur logiques « et » et « ou »
• « ( ) » groupements
• « < » et « > » comparaison lexicographique de chaînes
• « == » la 2nd opérande est un motif style glob
• « =~ » la 2nd opérande est une ERE GNU
$ a= bonjour
$ [[ $a == ?o* && $a =~ (o[un]j ?){2} ]]; echo $?
Attention
• Les [ et test internes bash acceptent certaines extensions
• En bash préférez « [[ ]] », en shell POSIX utilisez « [ ] »
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 74 / 80
Boucle for
Notes
• done est le mot clé de fin
• « in mot... » est optionnel et vaut par défaut « in "$@" »
• Attention au split-glob des mots
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 75 / 80
Exemple de for
Note de style
• On aligne for et done
• On met le do a la fin des lignes (après le ;)
• On indente la liste d’instructions
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 76 / 80
Attention au for
Quel est le problème de
for f in $(ls *.gz ); do
gunzip "$f"
done
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 77 / 80
Attention au for
Quel est le problème de
for f in $(ls *.gz ); do
gunzip "$f"
done
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 77 / 80
Attention au for
Quel est le problème de
for f in $(ls *.gz ); do
gunzip "$f"
done
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 77 / 80
Attention au for
Quel est le problème de
for f in $(ls *.gz ); do
gunzip "$f"
done
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 77 / 80
Sous-programmes
nom() { liste; }
• Définit une fonction nom
• nom utilisé en commande appelle la fonction
• Les arguments de l’appel sont passés en paramètres positionnels
($1, $2…)
• Les autres variables ont une portée globale par défaut
Note
• Le mot clé return termine une fonction avec un code de retour
• Le mot clé local permet de déclarer des variable locales
• Les fonctions s’utilisent comme des commandes: dans des
conduites, en arrière plan, dans des substitution de commandes,
etc.
• On peut faire des fonctions récursives
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 78 / 80
Exemple de fonction
Qu’affiche le programme suivant ?
#!/ bin/sh
foo () {
echo "FOO $@"
local c=X
d=Y
}
c=cé
d=dé
foo a b "$c" "$d"
foo a b "$c" "$d"
Note de style
• Nommez les fonctions en minuscules (de « a » à « z » et « _ »)
• On aligne le nom et l’accolade « } »
• On met l’accolade « { » à la fin de la ligne (après le « () »)
• On indente le corps de la fonction
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 79 / 80
Aller plus loin
Nous avons vu rapidement les fonctionnalités de base d’un shell Unix
• La spécification POSIX du langage du shell
• Quelques extensions bash (GNU)
Nous vous laissons le loisir d’en apprendre plus par vous-même
• $IFS: séparateur interne de champ (internal field separator)
• while: boucle while
• case: construction switch/case
• read: lecture de ligne
• alias: définition d’alias
• ${}: développement avancé de paramètres
• exec: recouvrement (et contrôle des flots)
• eval: exécution de commande construite
• trap: capture de signaux
• et plein d’extensions bash
J. Privat & A. Blondin Massé (UQAM) Chapitre 7: Scripts shell INF1070 Hiver 2019 80 / 80