Shell scripting
Introduction
Un script shell est une suite d'instruction shell le tout encapsulé dans un fichier avec l'extension .sh
.
helloworld.sh | |
---|---|
helloworld.sh | |
---|---|
Exécution
Les scripts shell peuvent aussi être définis comme des commandes exécutables.
La convention veut alors que l'on ne met pas l'extension à la fin, le fichier s'appelant alors simplement helloworld
.
Si on essaye tout de suite de lancer le script comme un exécutable, on aura l'erreur suivante.
Pour pouvoir le lancer en tant qu'exécutable, Linux a besoin de savoir dans quel chemin chercher ce script.On peut trouver la liste des chemins en tapant echo $PATH
.
Pour rajouter le chemin du script en tant qu'exécutable, on utilise la commande suivante.
chmod
.
Autorise l'éxécution | |
---|---|
Cette fois ci ça va marcher | |
---|---|
Les variables
Définition statique
Dans un script schell, les variables sont définies avec le symbole $
, comme dans la commande permettant de voir le shell que l'on utilise.
Attention
Un nom de variable ne peut contenir que des caractères alphanumériques ou underscore _
. Shell est aussi sensible à la casse.
$variable_1
fontionnne, mais pas $variable-1
.
Une varible peut aussi stocker le résultat d'un autre script, dans ce as là, on définit alors la variable avec des parenthèses en plus.
Une variable à laquelle ont rajouter quelque chose, comme du text, doit être encapsulé entre accolades ${...}
.
Définiion dynamique
Les arguments en ligne de commande
Dans un terminal, les arguments définis pour un script shell sont des variables spécifiques stockées sous la variables $k
où k correspond au k-ième argument défini dans le terminal.
$0
correspond au nom du script,$1
correspond au premier argument après le nom du script,- etc.
Inputs
Autre autre façon de définir une variable est de la demander comme input dans le terminal, cela se fait avoir la commande read
, on peut rajouter l'argument -p
(p pour "prompt") pour définir un texte à afficher dans le terminal avant de donner la variable d'input.
Arithmétique
Pour faire des calculs, on peut utiliser la commande expr
, chacun des éléments de l'opération doit alors être sépaaré par un espace.
Pour une multiplication, le symbole * doit être échappé | |
---|---|
Au lieu d'utiliser une commande particulière, on peut utiliser echo
, il faut alors mettre le calcul entre double parenthèses.
bc pour basic computer -l pour les floats | |
---|---|
Les contrôles logiques
if
La condition définissant if
est toujours comprises entre crochets, et un espace doit être présent entre chaque membre de la condition.
helloworld-if.sh | |
---|---|
- =
- !=
- -eq
- -ne
- -gt
- -lt
Les doubles crochets pour les conditions [[ condtion ]]
sont une amélioration des crochets simples, ils ne sont disponibles que pour bash
et les shells plus récents. Ils permettents l'écriture de conditions plus fines.
Pour gérer plusieurs conditions à la fois,
- on utilise
&&
pour l'intersection.
Si condition1 et condition2 sont vraies, alors... | |
---|---|
Si condition1 et condition2 sont vraies, alors... | |
---|---|
- on utilise
||
pour l'union.
Si condition1 ou condition2 est vraie, alors... | |
---|---|
Pour le système de fichier, on a les commandes suivantes.
Commande | Résultat |
---|---|
[ -e FILE ] |
si le fichier existe |
[ -d FILE ] |
si le fichier existe et est un répertoire |
[ -s FILE ] |
si le fichier existe et a un taille plus grande que 0 |
[ -x FILE ] |
si le fichier est éxecutable |
[ -w FILE ] |
si le fichier est écrivable |
for
La liste peut être sstockée dans un autre fichier | |
---|---|
helloworld-for.sh | |
---|---|
Pour faire une itération sur des entiers, on peut utiliser la commande {0..k}
, comme range(k)
en python.
helloworld-for2.sh | |
---|---|
Ecriture de la boucle en style C
Exemples
Compte le nombre de lignes dans des fichiers | |
---|---|
Installer les packages d'une liste | |
---|---|
rename all files within the images folder that has extension jpeg to jpg | |
---|---|
while
helloworld-while.sh | |
---|---|
Tant que le nom d'utilisateur donné dans le terminal est mathieu
, il écrira et listera les élements qui sont présents dans list.txt
. avant le done
, il est nécessaire de réévaluer la valeur de user
pour savoir si l'on reste dans la boule while
où si l'on en sort.
Exemple | |
---|---|
case
case
permet de remplacer les longues listes de if-then-else
en définissant les choix différements.
Exemple | |
---|---|
Shebang
Comme expliqué dans la partie sur Linux, il existe plusieurs types de shells, et chaque shell peut avoir un jeu de commandes spécifiques qui ne marcheront pas dans un autre shell.
Par exemple, si l'on reprend le script suivant.
helloworld-for2.sh | |
---|---|
la commande {1..5}
permettant de définir un intervalle n'est valable que pour le shell bash
, pour le dash
: Debian Almquist SHell, on aura le résultat suivant.
erreur | |
---|---|
Pour faire comprendre à votre terminal quel environnement utiliser pour lancer le script, on utilise un shebang. Un shebang est une ligne rajoutée au tout début d'un script définissant quel shell doit être utiliser pour lancer le script.
Un shebang s'écrit de cette façon : #!/bin/bash
, #!
suivi de l'adresse du shell à utiliser. Cela va automatiquement instruire le terminal qu'il faudra alors lancer le script via le shell bash.
Attention
Le shebang n'est utile que si le script doit se lancer en éxecutable, ie avec chmod +x
.
Taper sh helloworld-for2.sh
, même avec le shebang #!/bin/bash
ajouté résultera en une erreur comme au dessus car là on a explicitement spécifié que l'on voulait utilser sh
et non bash
.
Par contre, lancer ./helloworld-for2.sh
ne posera aucun soucis, le shebang disant d'utiliser bash
pour lancer le script.
#!/bin/sh
est par exemple le shebang pour utiliser le shell
classique.
Exit codes
Tout script shell qui finit son éxecution produit un code de sortie (exit code) et un statut de sortie (exit status).
- Si
exit status = 0
alors le script s'est terminé sans encombres. - Si
exit status > 0
alors le script s'est terminé suite à une erreur.
Les codes de sorties ne sont pas affichés dans le terminal une fois le script fini. Le code de sortie d'un script est stocké dans une variable spécifique : ?
, pour voir le code de sortie d'une commande, on tape alors echo $?
.
Pour définir explicitement le code de sortie à retourner lors d'un problème ou autre dans votre script, on utilise la commande exit k
où k est un chiffre compris en 0 et 255, généralement on utilise 1 pour dire qu'il y a eu un problème.
Les fonctions
The function add must echo the result so that it can be captured in the result variable. | |
---|---|
Checking
ShellCheck