« Script bash » : différence entre les versions

De Wiki doc

(Page créée avec « Category:programmation Le shell bash peut être utilisé pour exécuter des scripts qui peuvent servir à automatiser des tâches manuellement ou de cron|façon... »)
 
Aucun résumé des modifications
Ligne 1 : Ligne 1 :
[[Category:programmation]]
[[Category:programmation]]
Le [[shell bash]] peut être utilisé pour exécuter des scripts qui peuvent servir à automatiser des tâches manuellement ou de [[cron|façon programmé]].
Le [[shell bash]] peut être utilisé pour exécuter des scripts qui peuvent servir à automatiser des tâches manuellement ou de [[cron|façon programmé]].
{{attention|Ne touche pas encore à cette page, je souhaite suivre un plan.}}


{{info|Les concepts de programmation ne seront pas abordés dans cette documentation. Cette dernière a seulement pour but de rassembler de la syntaxe pour une réutilisation rapide de code bash.}}
{{info|Les concepts de programmation ne seront pas abordés dans cette documentation. Cette dernière a seulement pour but de rassembler de la syntaxe pour une réutilisation rapide de code bash.}}
Ligne 22 : Ligne 20 :
   chercheFichiers=`find / -type f -iname "*.txt" | wc -l` 2>/dev/null
   chercheFichiers=`find / -type f -iname "*.txt" | wc -l` 2>/dev/null
=Codes de retour=
=Codes de retour=
Toutes les commandes Linux retournent un code d'erreur compris entre 0 et 255.
Le code 0 retourne le drapeau vrai.
Les codes supérieurs à 0 sont des drapeaux faux. L'intérêt d'avoir plus de deux états est de pouvoir retourner un message d'erreur personnalisé en fonction de l'erreur du script.


=Test sur des fichiers=
Le code de retour de la dernière commande est stocké dans la variable <source lang="bash" inline>$?</source>.
==Exemple==
<source lang="bash">
utilisateur@machine:/$ ls /
bin  etc        initrd.img.old  lost+found  opt  run  sys  var
boot  home        lib            media      proc  sbin  tmp  vmlinuz
dev  initrd.img  lib64          mnt        root  srv  usr  vmlinuz.old
utilisateur@machine:/$ echo $?
0
utilisateur@machine:/$ ls /titi
ls: impossible d'accéder à '/titi': Aucun fichier ou dossier de ce type
utilisateur@machine:/$ echo $?
2
</source>
On peut également, lors d'une instruction qui est sensé terminer le script, renvoyer un code de retour via la commande :
exit NUM_CODE
=Les tests=
Sous Linux, tout est fichier. Lors de l'exécution d'un script, il peut être utile de connaître le type ou l'existence d'un ficher (un dossier est un fichier) avant d'exécuter une action. Les tests seront donc appréciables en combinaison d'une structure conditionnelle ou d'une boucle.
Sous Linux, tout est fichier. Lors de l'exécution d'un script, il peut être utile de connaître le type ou l'existence d'un ficher (un dossier est un fichier) avant d'exécuter une action. Les tests seront donc appréciables en combinaison d'une structure conditionnelle ou d'une boucle.


Les tests s'effectuent via la commande <source lang="bash" inline>test</source>
Les tests s'effectuent via la commande <source lang="bash" inline>test</source>. Cette commande renvoi un code de retour en fonction de l'issue du test. Lorsque <source lang="bash" inline>test</source> est utilisé dans une structure conditionnelle ou une boucle, seul son argument est utilisé, l'appel à la commande étant implicite.
==Test sur des fichiers==
{| class="wikitable"
|-
! Argument !! Effet
|-
| FICHIER1 -nt FICHIER2 || Vérifie si FICHIER1 est plus récent que FICHIER2 (newer than)
|-
| FICHIER1 -ot FICHIER2 || Vérifie si FICHIER1 est plus vieux que FICHIER2 (order than)
|-
| -b || Vérifie si le fichier existe et si c'est un fichier spécial en mode bloc
|-
| -c || Vérifie si le fichier existe et si c'est un fichier spécial en mode caractère
|-
| -d || Vérifie si le fichier existe et si c'est un répertoire
|-
| -e || Vérifie si le fichier existe (peu importe le type de fichier)
|-
| -f || Vérifie si le fichier existe et si c'est un fichier ordinaire
|-
| -g || Vérifie si le fichier existe et si son bit set-GID est positionné
|-
| -G || Vérifie si le fichier existe et si il appartient au GID effectif de l'appelant
|-
| -h ou -L || Vérifie si le fichier existe et si c'est un lien symolique
|-
| -k || Vérifie si le fichier existe et si son bit collant (sticky) est positionné
|-
| -O || Vérifie si le fichier existe et si il appartient à l'UID de l'appelant
|-
| -p || Vérifie si le fichier existe et si c'est un tube nommé
|-
| -r || Vérifie si le fichier existe et si il est lisible
|-
| -s || Vérifie si le fichier existe et si il est de taille non nulle
|-
| -S || Vérifie si le fichier existe et si c'est un socket
|-
| -t || Vérifie si le descripteur de fichier FD est ouvert sur un terminal
|-
| -u || Vérifie si le fichier existe et si son bit setuid est positionné
|-
| -w || Vérifie si le fichier existe et si il est accessible en écriture
|-
| -x || Vérifie si le fichier existe et si c'est exécutable (ou si il peut être parcouru dans le cas d'un répertoire)
|}
==Test sur des valeurs==
{| class="wikitable"
|-
! Argument !! Équivalent PHP !! Effet
|-
| -n || !empty() || La longueur de CHAÎNE est non nulle
|-
| -z || empty() ||La longueur de la CHAÎNE est nulle
|-
| -eq || == || Test d'égalité
|-
| -ne || != || Test d'inégalité
|-
| -lt || < || Test d'infériorité absolut
|-
| -le || <= || Test d'infériorité
|-
| -gt || > || Test de supériorité absolut
|-
| -ge || >= || Test de supériorité
|}
=Structures conditionnelles=
Les structures conditionnelles permettent d'effectuer des instruction en fonction de conditions. Combinés aux tests vus précédemment, elles vont permettres un comportement évolutif du script en fonction des événements qui lui seront présentés.
 
Il existe deux grand type de structure conditionnelle en bash.
==La structure IF, ELIF, ELSE==
La syntaxe est similaire aux autres langages. Elle ce présente comme suit :
<source lang="bash">
if [ OPTION_DE_TEST FICHIER_À_TESTER ]
then
INSTRUCTION1
INSTRUCTION2...
elif [ OPTION_DE_TEST FICHIER_À_TESTER ]
then
INSTRUCTION1
INSTRUCTION2
INSTRUCTION3...
else
INSTRUCTION1
fi
</source>
==La structure CASE==
La syntaxe est similaire à un couple switch/case en PHP. Très utile lorsqu'elle est utilisé avec un <source lang="bash" inline>read</source>, elle est plus adapté qu'un enchaînement de <source lang="bash" inline>elif</source> lorsqu'il s'agit de contrôler une entré utilisateur en fonction d'un choix proposé. Elle se présente comme suit :
<source lang="bash">
case variableRead in
OUI|Oui|oui|o|YES|Yes|yes|y)
INSTRUCTION1
INSTRUCTION2...
;;
NON|Non|non|n|NO|No|no)
INSTRUCTION1
INSTRUCTION2...
;;
*)
INSTRUCTION1...
;;
esac
</source>
=Boucles=
Les boucles permettent d'exécuter un ensemble d'instruction de façon répété en fonction d'une condition. Il existe deux types de boucle en bash.
==La boucle FOR==
La boucle for permet de parcourir une liste de valeurs, elle effectue donc un nombre de tours de boucle qui est connu à l'avance. Elle supporte deux syntaxes.
===Première syntaxe===
Avec cette syntaxe, <source lang="bash" inline>for</source> parcours le contenu d'une liste et se termine lorsque tout les éléments on été parcourus.
<source lang="bash">
for $variable in liste_valeurs
    do instruction(s)
done
</source>
====Exemple====
On peut utiliser cette façon de faire pour obtenir un comportement similaire à la commande ls.
<source lang="bash">
for i in *
do
echo $i
done
</source>
Dans cet exemple, l'étoile est remplacée par tous les fichiers du répertoire courant, la boucle va donc donner successivement comme valeur à la variable i tous ces noms de fichier. Le corps de la boucle affichant la valeur de la variable i, le nom de tous les fichiers du répertoire courant sont affichés successivement.
===Seconde syntaxe===
Cette façon de faire se rapproche plus du comportement standard de la boucle <source lang="bash" inline>for</source> dans d'autre langages. Ainsi, elle prend 3 arguments. Un compteur qui sera incrémenté à chaque itération; la condition à remplir; l'incrémentation en elle même sous forme d'une opération arithmétique.
<source lang="bash">
for ((i=0 ; 10 - $i ; i++))
do
echo $i
done
</source>
==La boucle WHILE et UNTIL==
La boucle <source lang="bash" inline>while</source> exécute un bloc d'instructions tant qu'une certaine condition est satisfaite, lorsque cette condition devient fausse la boucle se termine. Cette boucle permet donc de faire un nombre indéterminé de tours de boucle, voire infini si la condition ne devient jamais fausse.
<source lang="bash">
while [ $valeur1 -ne $valeur2 ]
do
INSTRUCTION1
INSTRUCTION2...
done
</source>
La boucle <source lang="bash" inline>until</source> est identique à la boucle <source lang="bash" inline>while</source> sauf qu'elle est exécutée tant que la condition est fausse.
=Sources=
https://www.gnu.org/software/bash/manual/bashref.html
 
http://ss64.com/bash/test.html
 
http://www.quennec.fr/trucs-astuces/syst%C3%A8mes/gnulinux/programmation-shell-sous-gnulinux/les-bases-de-la-programmation-shell/les-variables-r%C3%A9serv%C3%A9es-du-shell/code-de-retour-dune-commande
 
https://fr.wikibooks.org/wiki/Programmation_Bash/Boucles

Version du 21 janvier 2017 à 15:55

Le shell bash peut être utilisé pour exécuter des scripts qui peuvent servir à automatiser des tâches manuellement ou de façon programmé.

INFORMATION

Les concepts de programmation ne seront pas abordés dans cette documentation. Cette dernière a seulement pour but de rassembler de la syntaxe pour une réutilisation rapide de code bash.

Commandes basiques

Afficher un message

echo "Mon message"

Afficher un message sans retour chariot"

echo -n "Quel est votre âge ? : "

Affectation de variable

maVarable=maValeur

Appel de variable

echo $maVariable

Lire une entrée clavier et remplir une variable avec

read maVariable

Mettre le résultat d'une commande bash dans une variable

chercheFichiers=`find / -type f -iname "*.txt" | wc -l`

Mettre le résultat d'une commande bash dans une variable en la rendant silencieuse

 chercheFichiers=`find / -type f -iname "*.txt" | wc -l` 2>/dev/null

Codes de retour

Toutes les commandes Linux retournent un code d'erreur compris entre 0 et 255.

Le code 0 retourne le drapeau vrai.

Les codes supérieurs à 0 sont des drapeaux faux. L'intérêt d'avoir plus de deux états est de pouvoir retourner un message d'erreur personnalisé en fonction de l'erreur du script.

Le code de retour de la dernière commande est stocké dans la variable $?.

Exemple

 utilisateur@machine:/$ ls /
 bin   etc         initrd.img.old  lost+found  opt   run   sys  var 
 boot  home        lib             media       proc  sbin  tmp  vmlinuz
 dev   initrd.img  lib64           mnt         root  srv   usr  vmlinuz.old
 utilisateur@machine:/$ echo $?
 0
 utilisateur@machine:/$ ls /titi
 ls: impossible d'accéder à '/titi': Aucun fichier ou dossier de ce type
 utilisateur@machine:/$ echo $?
 2

On peut également, lors d'une instruction qui est sensé terminer le script, renvoyer un code de retour via la commande :

exit NUM_CODE

Les tests

Sous Linux, tout est fichier. Lors de l'exécution d'un script, il peut être utile de connaître le type ou l'existence d'un ficher (un dossier est un fichier) avant d'exécuter une action. Les tests seront donc appréciables en combinaison d'une structure conditionnelle ou d'une boucle.

Les tests s'effectuent via la commande test. Cette commande renvoi un code de retour en fonction de l'issue du test. Lorsque test est utilisé dans une structure conditionnelle ou une boucle, seul son argument est utilisé, l'appel à la commande étant implicite.

Test sur des fichiers

Argument Effet
FICHIER1 -nt FICHIER2 Vérifie si FICHIER1 est plus récent que FICHIER2 (newer than)
FICHIER1 -ot FICHIER2 Vérifie si FICHIER1 est plus vieux que FICHIER2 (order than)
-b Vérifie si le fichier existe et si c'est un fichier spécial en mode bloc
-c Vérifie si le fichier existe et si c'est un fichier spécial en mode caractère
-d Vérifie si le fichier existe et si c'est un répertoire
-e Vérifie si le fichier existe (peu importe le type de fichier)
-f Vérifie si le fichier existe et si c'est un fichier ordinaire
-g Vérifie si le fichier existe et si son bit set-GID est positionné
-G Vérifie si le fichier existe et si il appartient au GID effectif de l'appelant
-h ou -L Vérifie si le fichier existe et si c'est un lien symolique
-k Vérifie si le fichier existe et si son bit collant (sticky) est positionné
-O Vérifie si le fichier existe et si il appartient à l'UID de l'appelant
-p Vérifie si le fichier existe et si c'est un tube nommé
-r Vérifie si le fichier existe et si il est lisible
-s Vérifie si le fichier existe et si il est de taille non nulle
-S Vérifie si le fichier existe et si c'est un socket
-t Vérifie si le descripteur de fichier FD est ouvert sur un terminal
-u Vérifie si le fichier existe et si son bit setuid est positionné
-w Vérifie si le fichier existe et si il est accessible en écriture
-x Vérifie si le fichier existe et si c'est exécutable (ou si il peut être parcouru dans le cas d'un répertoire)

Test sur des valeurs

Argument Équivalent PHP Effet
-n !empty() La longueur de CHAÎNE est non nulle
-z empty() La longueur de la CHAÎNE est nulle
-eq == Test d'égalité
-ne != Test d'inégalité
-lt < Test d'infériorité absolut
-le <= Test d'infériorité
-gt > Test de supériorité absolut
-ge >= Test de supériorité

Structures conditionnelles

Les structures conditionnelles permettent d'effectuer des instruction en fonction de conditions. Combinés aux tests vus précédemment, elles vont permettres un comportement évolutif du script en fonction des événements qui lui seront présentés.

Il existe deux grand type de structure conditionnelle en bash.

La structure IF, ELIF, ELSE

La syntaxe est similaire aux autres langages. Elle ce présente comme suit :

 if [ OPTION_DE_TEST FICHIER_À_TESTER ]
 then
 	INSTRUCTION1
 	INSTRUCTION2...
 elif [ OPTION_DE_TEST FICHIER_À_TESTER ]
 then
 	INSTRUCTION1
 	INSTRUCTION2
 	INSTRUCTION3...
 else
 	INSTRUCTION1
 fi

La structure CASE

La syntaxe est similaire à un couple switch/case en PHP. Très utile lorsqu'elle est utilisé avec un read, elle est plus adapté qu'un enchaînement de elif lorsqu'il s'agit de contrôler une entré utilisateur en fonction d'un choix proposé. Elle se présente comme suit :

 case variableRead in
 	OUI|Oui|oui|o|YES|Yes|yes|y)
 		INSTRUCTION1
 		INSTRUCTION2...
 		;;
 	NON|Non|non|n|NO|No|no)
 		INSTRUCTION1
 		INSTRUCTION2...
 		;;
 	*)
 		INSTRUCTION1...
 		;;
 esac

Boucles

Les boucles permettent d'exécuter un ensemble d'instruction de façon répété en fonction d'une condition. Il existe deux types de boucle en bash.

La boucle FOR

La boucle for permet de parcourir une liste de valeurs, elle effectue donc un nombre de tours de boucle qui est connu à l'avance. Elle supporte deux syntaxes.

Première syntaxe

Avec cette syntaxe, for parcours le contenu d'une liste et se termine lorsque tout les éléments on été parcourus.

 for $variable in liste_valeurs
     do instruction(s)
 done

Exemple

On peut utiliser cette façon de faire pour obtenir un comportement similaire à la commande ls.

 for i in *
 do
 	echo $i
 done

Dans cet exemple, l'étoile est remplacée par tous les fichiers du répertoire courant, la boucle va donc donner successivement comme valeur à la variable i tous ces noms de fichier. Le corps de la boucle affichant la valeur de la variable i, le nom de tous les fichiers du répertoire courant sont affichés successivement.

Seconde syntaxe

Cette façon de faire se rapproche plus du comportement standard de la boucle for dans d'autre langages. Ainsi, elle prend 3 arguments. Un compteur qui sera incrémenté à chaque itération; la condition à remplir; l'incrémentation en elle même sous forme d'une opération arithmétique.

 for ((i=0 ; 10 - $i ; i++))
 	do
 		echo $i
 done

La boucle WHILE et UNTIL

La boucle while exécute un bloc d'instructions tant qu'une certaine condition est satisfaite, lorsque cette condition devient fausse la boucle se termine. Cette boucle permet donc de faire un nombre indéterminé de tours de boucle, voire infini si la condition ne devient jamais fausse.

 while [ $valeur1 -ne $valeur2 ]
 do
 	INSTRUCTION1
 	INSTRUCTION2...
 done

La boucle until est identique à la boucle while sauf qu'elle est exécutée tant que la condition est fausse.

Sources

https://www.gnu.org/software/bash/manual/bashref.html

http://ss64.com/bash/test.html

http://www.quennec.fr/trucs-astuces/syst%C3%A8mes/gnulinux/programmation-shell-sous-gnulinux/les-bases-de-la-programmation-shell/les-variables-r%C3%A9serv%C3%A9es-du-shell/code-de-retour-dune-commande

https://fr.wikibooks.org/wiki/Programmation_Bash/Boucles