Scripts shell (bash)
Un script shell est un fichier texte contenant une liste de commandes shell et il est exécuté comme un programme pour réaliser une tâche ou un ensemble de tâches. L’objectif principal d’un script shell est d’automatiser des tâches et de gagner du temps. Il est important de comprendre la structure de base d’un script shell, car c’est vous qui interagissez avec une grappe de calcul via des scripts shell (Voir le chapitre suivant sur le moteur de grille)
Qu’est-ce que Bash ?
Il existe de nombreux shells différents disponibles dans les systèmes de type Unix. Le Bourne Again Shell (Bash) est l’un d’entre eux, il est l’interpréteur de commandes par défaut sur les systèmes GNU/Linux. Il a quelques avantages par rapport aux autres shells et est à peu près le shell standard, et nous allons montrer comment l’utiliser pour le scriptage ci-dessous.
Écrire un script shell bash simple
Un script shell de base est juste une série de commandes. C’est ce que nous allons montrer ensuite.
Écrivons un script simple qui sort « hello world » sur l’écran en utilisant la commande echo
. Nous enregistrerons le fichier texte sous le nom de myScript.sh
#!/bin/bash echo Hello World
exécution d’un script shell syntaxe:bash your-script-name
. Dans notre cas, nous écrivons:
$ bash myScript.sh Hello World
exemple plus compliqué
Écrivons un script un peu plus compliqué en utilisant davantage de commandes shell. Le script utilise le ls
pour lister les fichiers et utilise la commande wc -l
qui compte le nombre de lignes dans un fichier donné ou une entrée standard. Dans ce cas, wc -l
compte le nombre de lignes dans la sortie de ls -l
. Tout cela réalisé en utilisant le pipe |
.
contenu du script.sh:
#!/bin/bash echo here are the list of files ls -l echo The number of files: ls -l | wc -l
On peut l’exécuter comme suit:
$ bash script.sh
variables dans les scripts bash
On peut aussi utiliser des variables dans les scripts bash. Qui sont utiles pour capturer la sortie des commandes intermédiaires et les utiliser pour exécuter d’autres commandes.Il n’y a pas de types de données pour les variables. Une variable dans bash peut contenir l’un des éléments suivants : un nombre, un caractère ou une chaîne de caractères.
Vous n’avez pas besoin de déclarer une variable, il suffit d’assigner une valeur à sa référence pour la créer.
Nous allons maintenant créer un script simple avec une seule variable. Nous allons assigner la chaîne Hello world
à cette variable et imprimer cette variable avec echo
.
#!/bin/bash VAR="Hello world" echo $VAR
Lorsque nous avons assigné la variable, nous n’avons pas utilisé le signe $
, mais lorsque nous avons utilisé la variable, nous avons dû utiliser le signe $
.
Arguments de ligne de commande dans les scripts bash
Le script peut également prendre des arguments de ligne de commande. Ici, nous modifions le script qui liste le fichier pour prendre un argument de ligne de commande. L’argument sera un chemin vers un répertoire.
contenu du script2.sh:
#!/bin/bash VAR= echo here are the list of files ls -l $VAR echo The number of files: ls -l $VAR | wc -l
Voici comment on exécute le script:
$ bash script2.sh /home/user/project
Les arguments sont stockés dans des variables avec un numéro dans l’ordre de l’argument en commençant par 1
- Premier Argument : 1
- Deuxième argument : 2
- et ainsi de suite…
Dans notre cas, correspond à
/home/user/project
.
Opérations arithmétiques scripts bash
Les opérations arithmétiques sur les entiers en bash se font au format suivant :
#!/bin/bash x=6 y=2 $((10 - 5)) $((x-y)) echo $((x-y)) echo $((10-5))
Vous pouvez aussi copier coller ces commandes dans la console pour voir comment elles fonctionnent. Les commandes echo
devraient produire 4
et 5
.
L’arithmétique de bash ne supporte pas les points flottants (par exemple, l’opération 1,3 -1 ne fonctionnera pas en bash), vous devez utiliser la commande bc
. Voir cet exemple de stackOverflow pour un exemple sur la façon d’utiliser bc
.
Looping over files
Si vous essayez d’automatiser une tâche en utilisant le script bash, il est très probable que vous devrez appliquer certaines commandes sur chaque fichier dans un répertoire. Cela pourrait être réalisé avec des boucles à caractère sauvage*
et for
. Le script suivant stocke tous les fichiers ‘.txt’ du répertoire /path/to
dans la variable FILES
. Ensuite, pour chaque fichier, il calcule le nombre de lignes et le sort avec la commande wc -l
.
#!/bin/bash FILES=/path/to/*.txt for f in $FILES do echo "Processing $f file..." # count number of lines and output that for file $f wc -l $f done
Plus sur les scripts bash
Vous pouvez écrire des scripts shell encore plus compliqués en utilisant des structures de contrôle (boucles if/else, for/while) et réaliser beaucoup de choses juste en utilisant le script shell, mais cela dépasse le cadre de ce document. Consultez les liens ci-dessous si vous voulez vous améliorer dans l’écriture de scripts shell.
- http://www.freeos.com/guides/lsst/
- http://www.tldp.org/LDP/Bash-Beginners-Guide/html/
.