Tout d'abord à quoi bon faire des scripts ? Pour un tas de choses... L'utilisation et surtout l'administration d'un ordi demandent parfois d'automatiser des tâches ou bien de prendre des décisions. Un script est donc un programme en ligne de commande. Dans le cas le plus simple, cela revient à un enchaînement linéaire de commandes. Il est évident que les scripts peuvent faire beaucoup plus, ils ressemblent alors à de vrais programmes.
Les scripts peuvent inclure des variables (x=32), des blocs conditionnels (si x=32 alors lance la commande Y) ou des blocs répétitifs (tant que x<31 lance la commande Y et reessaye le test) et même des 'modules'. Nous verrons quels usages faire de ces fonctionalités.
Le Shell est un interpréteur de commande : il est l'interface entre Linux et vous. Il existe de nombreux Shell mais le plus courant est le Bash. Il y a de bonne chance pour que cela soit celui par défaut dans votre console. Pour vérifier quel Shell utilise votre console, tapez dedans echo $SHELL.
Pour ceux que cela interresse, il existe des languages de programmation beaucoup (oui beaucoup) plus évolués comme le C++, le Java, le Pascal... Ce n'est pas l'objet de cet article même si cela peut être un bon départ.
Ecriture et exécution du scriptPour écrire un script, ouvrez votre éditeur de texte favori. Sous KDE, je vous conseille Kate. La première commande à indiquer est le nom du language utilisé pour le script. Ainsi, tous les scripts Bash commencent par cette commande :
#!/bin/sh
Vous pouvez tout aussi bien mettre à la place #!/bin/bash
Une fois le script écrit, sauvez le comme un fichier texte normal. Pour l'utiliser, il vaut mieux le rendre exécutable par la commande chmod :
$ chmod +x /chemin/nom_du_script
puis l'exécuter par l'une de ces deux commandes :
- $ sh /chemin/nom_du_script
- $ ./chemin/nom_du_script
Si vous avez rendu le script exécutable, ces 2 méthodes fonctionnent, sinon, seule la 2èm marche. Enfin, un script exécutable peut se lancer par un clic de souris.
Notez que Bash se soucie fort peu du formatage (retour à la ligne, position spatiale etc) que vous lui fournissez. Par contre, la relecture d'un programme est facilitée si vous espacez, commentez et tabulez vos scripts...
Les variables
Généralités
C'est la base de la programmation. Une variable c'est un aide-mémoire électronique. Ainsi, x=256 attribue la valeur 256 à la variable du nom de x . De même, x=y veut dire que x doit prendre la même valeur que y. Ce n'est donc pas une expression algèbrique mais un ordre d'assignation de valeur. C'est encore plus clair avec cet exemple x=x+1 qui augmente (on dit incrémenter) la valeur de x de 1. Ainsi, si x avait '5' pour valeur, il vaudra '6' après. Cette expression est évidemment une hérésie en algèbre mais tout à fait classique en programmation.
Une variable peut contenir une valeur :
- numérique (exemples : 3.14, 152 ou -223).
- alpha-numérique (du texte si vous préferez).
Attention, Bash ne type pas ses variables comme le ferait Basic ou C : une variable reste en définitive une chaîne de caractères même si elle contient des chiffres. Si la variable contient des chiffres, Bash autorise cependant des opérations mathématiques. Le non-typage des variables est un souci de moins mais attention : c'est vous qui devez vous rappeller de ce que vous mettez dans vos variables.Attribution de valeur
Pour attribuer une valeur à une variable au sein d'un script Bash, il existe plusieurs manières :
- prénom=Marie affecte la valeur 'Marie' à la variable prénom. Si jamais la valeur contient un espace alors mettez des doubles guillements. Exp : nom="Marie Curie". Attention, pas d'espace de part et d'autre du signe égal.
- L'instruction let permet des substitutions au lieu de simples affectations. Ainsi pour incrémenter x de 2 on dira let x=x+2 . La syntaxe let x += 2 apporte le même résultat.
- La commande read demande à l'utilisateur une entrée clavier. Ainsi read nom suspend le script le temps que l'utilisateur tape au clavier et valide par Entrée. La variable 'nom' contient alors l'entrée clavier.
- Lorsque vous tapez un nom de script suivi d'option(s), ces options sont attribuées (ont dit passées) à des variables. J'y reviendrai.
- Enfin, vous pouvez assigner le résultat d'une commande à une variable en l'entourant de guillement simple. Exemple : liste_fichier='ls'. Ceci passe le résultat de la commande ls à la variable liste_fichiers.
Caractères spéciaux
[...]
Utilisation de la variable
Pour utiliser la variable dans un script (c'est à dire extraire sa valeur), il suffit d'ajouter le signe $. Ainsi echo $nom affiche la valeur contenu dans la variable nom.
Si jamais la variable contenait des espaces (exemple nom="Marie Curie"), pour l'afficher correctement, il faut mettre des doubles guillemets : echo "$nom" .
Exécutions conditionnelles
Les conditions
Par là, je veux dire que Bash est capable en fonction du résultat d'un test ou d'une valeur de variable d'exécuter une commande plutôt qu'une autre. C'est encore une base de la programmation.
Bash est un peu surprenant à ce sujet puisqu'il n'existe pas de booléens (vrai/faux).
Voici comment on écrit des conditions en Bash :
[...]
La structure if
Cette structure permet d'executer des commandes en fonction du résultat d'une expression ou d'une commande. Voici sa syntaxe :
if
condition A
then
commande B
else
commande C
fi
En gros, si (if) la condition A est vraie alors (then) la commande B est executée. Sinon (else), c'est la commande C qui sera lancée. Le mot clé fi clot la structure. Voici un exemple concret (à coller dans votre éditeur de texte) :
#!/bin/sh
echo "Entrez un nom d'utilisateur : "
read nom
if
who | grep $nom > /dev/null
then
echo "L'utilisateur $nom est connecté."
else
echo "L'utilisateur $nom est absent.".
fi
Explications : Après l'entrée clavier par read d'un nom d'utilisateur (variable nom), un test est effectué. La commande who sort tout les utilisateurs connectés. La commande grep permet de faire une recherche dans la sortie de la commande who (grâce au 'pipe', le symbole | ). On peut donc voir si la valeur de la variable nom est contenue dans la liste des utilisateurs connectés. La structure if/fi oriente alors vers telle ou telle commande selon le résultat. Notez que la portion > /dev/null permet de ne pas afficher dans la console les messages de la commande juste avant (en fait, elle redirige ces messages vers le néant).
La structure case
Elle permet aussi une exécution de commandes sous conditions mais sa syntaxe est un peu différente. Selon les cas, elle est avantageuse à if. Voici sa syntaxe :
case variable_X in
possibilité1) commande A ;;
possibilité2) commande B ;;
...
esac
Ici, un test est effectué sur le contenu de variable_x. Sa valeur est successivement comparée aux éventualités (possibilité1, 2...) que vous avez prévus dans le script. Si la valeur concorde, alors la ou les commandes en regard est lancée. Voici l'exemple concret que vous attendez :
#!/bin/sh
echo "Tapez sur une touche et validez : "
read touche
case $touche in
a) echo "Vous avez appuyé sur la touche a" ;;
A) echo "Vous avez appuyé sur la touche A" ;;
b|B) echo "Vous avez appuyé sur la touche b ou B" ;;
*) echo "Vous avez appuyé sur autre chose que a, A, b et B" ;;
esac
La commande test
[...]
Exécutions répétées
Parfois vous aurez envie de répeter x fois une commande ou un bloc de commandes. On parle de boucle itérative.
La boucle for
[...]
La boucle while
Avec la boucle while, l'itération (la boucle si vous préférez) se poursuit tant que la condition testée reste vraie (ou fausse). Voici sa syntaxe :
while expression_A
do
commandeA
commandeB
...
done
Ainsi, tant que expression_A est vraie, le bloc de commande entre do et done est lu en boucle. La sortie de la boucle (au-delà du mot-clé done) ne survient que si expression_A n'est plus vraie. Attention donc à ne pas faire une boucle immortelle : il faut d'une manière ou d'une autre que la valeur de l'expression soit modifiée dans la boucle. Sinon, un CTRL+C devrait alors vous sauver... Exemple concret :
#!/bin/sh
x=0
while (( $x<10 ))
do
let x=x+1
echo $x
done
echo "Fin de la boucle"
Au début, on attribue à x la valeur de zéro, puis la boucle while se continue tant que x est inférieur à 10. On fait bien attention d'augmenter de 1 la valeur de x à chaque passage dans la boucle. Il arrive un moment où x vaut 10, l'entrée dans la boucle n'est alors plus possible.
Liens externes
Tutoriel complet.