Je script, je script, mais parfois, j'ai un sacré trou de mémoire ... et je galère à trouver ce que je cherche sur Internet.
Comment on incrémente une variable ? Comment on fait un SI, un POUR ?
Et bien la réponse se trouve ci-dessous !
Comme tout script BASH, le doit posséder son SHEBANG :
De façon plus moderne, on peut utiliser :
Pour mettre dans la variable
a la valeur
chaîne abcdefghijklmnopqrstuvwxyz :
De la même façon, on peut mettre dans des variables des nombres :
On peut mettre dans une variable le résultat d'une
commande shell en encadrant la commande dans
$() :
On pourra veiller à déclarer correctement les variables avec la commande
declare pour forcer le type :
On peut faire du 2 en 1 évidemment : déclarer et affecter
Si vous voulez demander à l'utilisateur de taper du texte, et de récupérer le contenu dans une variable, c'est possible. C'est la commande read :
Ici, stockons le résultat de la saisie dans la variable TEXTE :
Avec l'option -p on pourra même mettre un message avant la saisie (qui se sera pas inclus dans le contenu de la variable) :
Il est possible de définir une valeur par défaut à la variable si celle-ci est vide ou non définie :
Si la variable choix a déjà une valeur, alors l'expression reste inchangée, et la valeur de choix reste la même.
Si la variable choix est vide ou non définie, alors elle est assignée à la valeur "N".
Pour utiliser ces variables, ajouter un
$ devant. Exemple pour afficher la variable a :
On peut l'appeler en l'encadrant avec ${} :
On peut aussi afficher la longueur de cette variable avec ${#var} :
On peut aussi extraire une sous-chaine à la volée
Depuis une position (première position à 0) jusqu'à la fin :
Depuis une position avec une longueur :
Exemple pour afficher 6 caractères de la variable a en commençant au caractère 0 (début) :
Exemple pour afficher à partir du caractère 0 mais en retirant les 4 derniers caractères :
On peut aussi faire de la substitution directement dans la variable (sans passer par sed par exemple) :
Exemple, remplacer le "e" par "E" :
Si on veut que cela se fasse de manière globale (comme le /g de sed), on écrira 2 barres obliques :
On pourra aussi modifier la casse.
Forcer en MAJUSCULES :
Forcer en minuscules :
Il existe quelques variables spéciales :
$$ : PID du shell courant
$! : PID du dernier travail lancé en arrière plan
$? : code retour de la dernière commande
Quand on manipulera des arguments :
$0 : nom du script
$1 : premier argument
$2 $3 $3 ... : deuxième, troisième, quatrième, ... argument
$# : nombre total d'arguments
$@ : tous les arguments
${!#} : le dernier argument
Et d'autres variables prédéfinies, dites variables d'environnement :
$HOME chemin du répertoire personnel de l'utilisateur
$OLDPWD chemin du répertoire précédent
$PATH liste des chemins de recherche des commandes exécutables
$PPID PID du processus père du shell
$PS1 invite principale du shell
$PWD chemin du répertoire courant
$RANDOM nombre entier aléatoire compris entre 0 et 32767
$REPLY variable par défaut de la commande "read" et de la structure shell "select"
$SECONDS nombre de secondes écoulées depuis le lancement du shell
La commande shift permet de décaler les arguments passés au script.
Voici un exemple :
J'appelle le script ainsi :
Le résultat est :
On peut ainsi traiter des arguments dans une boucle par exemple.
Grosso-modo, pour faire des calculs simples, on utilise la syntaxe suivante :
On peut affecter ce calcul à une variable :
Ou bien l'afficher :
Si on veut faire une addition :
Si on veut faire une soustraction :
Si on veut faire une multiplication :
Si on veut faire une division :
On peut évidemment utiliser des variables dans le calcul :
Pour incrémenter ou décrémenter, on peut utiliser la fonction let :
Le test "Si'" est généralement fait ainsi :
Pour les exemples, nous avons besoin d'opérateurs de comparaison, voir ci-dessous.
En BASH, il y a deux possibilités pour écrire des tests :
et
La principale différence entre les deux est que le test avec le double crochet [[ ... ]] est propre à BASH et est une amélioration du simple crochet [ ... ], offrant des fonctionnalités supplémentaires telles que la manipulation de chaines avancées telles que les expressions régulières, ainsi que la possibilité d'utiliser des opérateurs logiques tels que && et ||.
Si on cherche à comparer simplement des nombres ou des chaînes le résultat est le même.
Par conséquent, j'utilise systématiquement le double crochet [[ ... ]].
-eq : est égal à
-ne : n'est pas égal à
-gt : est plus grand que
-ge : est plus grand ou égal à
-lt : est plus petit que
-le : est plus petit ou égal à
= : est égal à
!= : n'est pas égal à
-z string : Vrai si la longueur de la chaîne est égale à 0 (variable non initialisée ou vide)
-n string : Vrai si la longueur de la chaîne est supérieure à zero (variable initialisée et non vide)
=~ : match avec une regexp.
Exemple, si la variable contient "cou" :
Exemple, si ça commence par un a :
-z $var : Vrai si la taille de la chaîne est zéro (variable non utilisée ou vide)
-n $var : Vrai si la taille de la chaîne est différente de zéro (variable utilisée et non vide)
-e file : Vrai si le fichier existe
-d file : Vrai si le fichier existe et que c'est un répertoire
-f file : Vrai si le fichier existe et que c'est un fichier ordinaire
-h file : Vrai si le fichier existe et que c'est un lien symbolique
-r file : Vrai si le fichier possède les droits de lecture
-s file : Vrai si le fichier a une taille non nulle
-w file : Vrai si le fichier possède les droits d'écriture
-x file : Vrai si le fichier possède les droits d'exécution
-O file : Vrai si le possesseur est identique à celui qui exécute le test
-G file : Vrai si le possesseur qui exécute le test fait partie du groupe du fichier
-N file : Vrai si le fichier existe et qu'il a été modifié depuis sa dernière lecture
file1 -nt file2 : Vrai si le file1 est plus récent que file2 (date de modification) ou si file1 existe et pas file2
file1 -ot file2 : Vrai si file1 est plus ancien que file2 ou que file2 existe et pas file1
Le symbole de négation est
!.
Si on teste de cette façon su un dossier existe :
Et bien tester s'il existe pas se fera ainsi :
Si vous voulez combiner des tests (le ET ou bien le OU) c'est avec && et || :
Pour le ET :
Pour le OU :
Pour le for ce n'est pas très compliqué :
On peut traiter avec une commande aussi, par exemple la boucle ci-dessus peut être écrite en utilisant la commande
seq :
Et on peut aussi utiliser des chaines de caractère :
Pour la boucle infinie, utiliser ceci (fin de la boucle avec
break) ou
CTRL+C :
De manière générale, la syntaxe est la suivante :
Voici un exemple :
La boucle infinie se traduit ainsi :
La boucle infinie peut s’interrompre avec
break :
Le case (ou parfois dans d'autres langages switch) permet d'éviter l'imbrication de multiples if.
Voici un exemple. Le test peut être fait sur une chaine (ici B KB MB GB TB) ou sur des nombres :
Il est possible d'utiliser les tableaux en bash !
On pourra créer un tableau via :
L'espace est le délimiteur. Si on a besoin de stocker une valeur avec une espace, on mettra cette valeur entre guillemets :
Contenu du premier enregistrement du tableau "tab" :
ou
Contenu du quatrième enregistrement du tableau "tab" (oui ça commence à 0) :
Ensemble des enregistrements du tableau "tab" :
Longueur du quatrième enregistrement du tableau "tab" :
Nombre d'enregistrements du tableau "tab" :
Changer la première valeur du tableau "tab" :
On pourra ajouter des valeurs au tableau ainsi :
On pourra supprimer une valeur du tableau avec sa position (exemple pour le quatrième élément) :
On va pouvoir créer des fonctions pour les utiliser plusieurs fois :
Voici un exemple :
On appellera la confion avec son nom :
Pour lire les lignes d'un fichier :
Si on veut lire un fichier avec des lignes avec un séparateur (exemple passwd, qui a le séparateur : ) on peut stocker direct dans les variables
Pour vérifier si le script est lancé en root, on peut utiliser la variable $EUID qui contient 0 si on est root :
Tous se passe dans le code retour de la commande.
Exemple avec ls. La page man indique les différents codes retour :
Code TEXT : 0 si OK,
1 si problèmes mineurs (par exemple, impossible d'accéder à un
sous-répertoire),
2 si erreur grave (par exemple, impossible d'accéder aux pa‐
ramètres de la ligne de commande).
Ce code est stocké dans la variable
$? :
Voyons un exemple avec un succès (même si je n'ai rien dans /mnt, la commande n'a rencontré aucune erreur, le code vaut donc 0) :
Ici un exemple avec un répertoire inexistant (le code vaut 2) :
On peut tester le bon fonctionnement d'une commande en testant cette valeur retour :
La variable $? est modifiée à chaque exécution d'une commande.
On peut faire le test différemment ainsi :
Mettre le texte en couleur
Pour agrémenter vos scripts, vous pouvez mettre de la couleur.
Voici une liste des couleurs possibles (ici j'affecte à des variables les codes couleur) :
Dans un code de type
\033[0;31m pour le rouge, vous pouvez remplacer le 0 après le crochet ouvrant indique le style du texte.
0 : Standard
1 : Gras
2 : Ca semble plus foncé
3 : Italique
4 : Souligné
5 : Clignotant
7 : Surligné
9 : Barré
Voici un exemple en rouge et gras (notez l'usage de l'option -e de echo) :