Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format
PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:programmation:shells:script-bash-etat-de-sorie-et-les-tests [05/06/2014 08:38] Hypathie [État de sortie et les tests] |
doc:programmation:shells:script-bash-etat-de-sorie-et-les-tests [10/07/2014 16:45] Hypathie [État de sortie et code de retour] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== script bash : état de sorie et les tests ====== | + | ====== Script bash : état de sorie et les tests ====== |
- | * Objet : du tuto FIXME | + | * Niveau requis : {{tag>débutant}} |
- | * Niveau requis : FIXME {{tag>débutant avisé}} | + | |
- | * Commentaires : //Contexte d'utilisation du sujet du tuto. // FIXME | + | |
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | ||
- | * Suivi : {{tag>en-chantier à-tester à-placer}} - FIXME Pour choisir, voir les autres Tags possibles dans [[:atelier:#tags|l'Atelier]]. | + | * Suivi : {{tag>à-placer}} |
- | * Création par **Hypathie** 03/06/2014 | + | * Création par [[user>Hypathie]] 18/03/2014 |
- | * Testé par <...> le <...> FIXME | + | * Testé par <Hypathie> le <Juin 2014> |
- | * Commentaires sur le forum : [[url | Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) FIXME | + | * Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?pid=92203#p92203 | Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) |
- | **Nota : wiki n°5** | + | **Nota : Les autres wiki :** |
+ | * [[atelier:chantier:debuter-avec-les-scripts-shell-bash]] | ||
+ | * [[atelier:chantier:script-bash-variables-arguments-parametres|script-bash-variables-arguments-parametres]] | ||
+ | * [[atelier:chantier:script-bash-detail-sur-les-parametres-et-les-boucles|modification de variable et de paramètre]] | ||
+ | * [[atelier:chantier:script-bash-enchainement-de-commandes-et-etat-de-sortie|script-bash-enchainement-de-commandes-et-etat-de-sortie]] | ||
+ | * ;-) | ||
+ | * [[atelier:chantier:script-bash-les-tableaux|script-bash-les-tableaux]] | ||
+ | * [[atelier:chantier:script-bash-les-fonctions|script-bash-les-fonctions]] | ||
Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! | Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! | ||
Ligne 18: | Ligne 23: | ||
Il ne faut pas confondre le code de retour et le résultat d'une commande. Le résultat est ce qui s'inscrit sur la sortie standard. | Il ne faut pas confondre le code de retour et le résultat d'une commande. Le résultat est ce qui s'inscrit sur la sortie standard. | ||
- L'exécution de tous programmes et de toutes fonctions renvoie une valeur numérique appelée code de retour. | - L'exécution de tous programmes et de toutes fonctions renvoie une valeur numérique appelée code de retour. | ||
- | - Il est envoyé 0 si tout c'est bien passé lors de l'exécution, et un nombre entre 1 et 255 s'il y a eu une erreur. | + | - Il est envoyé ''0'' si tout c'est bien passé lors de l'exécution, et un nombre entre ''1 et 255'' s'il y a eu une erreur. |
- | - Pour récupérer le code de retour on utilise le paramètre spécial $? | + | - Pour récupérer le code de retour on utilise le paramètre spécial ''$?''. |
- Il y a des codes de retour particuliers, par exemple : | - Il y a des codes de retour particuliers, par exemple : | ||
Ligne 25: | Ligne 30: | ||
blabla | blabla | ||
</code> | </code> | ||
- | puis | + | |
<code user> | <code user> | ||
echo $? | echo $? | ||
</code> | </code> | ||
- | Retour : | ||
<code> | <code> | ||
127 | 127 | ||
</code> | </code> | ||
- | //On peut chercher dans les codes d'erreur de bash que 127 est le code de retour pour les commandes qui n'ont pas pu être trouvées. | + | |
- | // | + | >On peut chercher dans les codes d'erreur de bash que ''127'' est le code de retour pour les commandes qui n'ont pas pu être trouvées. |
L'état de sortie vrai ou faux ( 0 ou autre chose) est utilisé avec : | L'état de sortie vrai ou faux ( 0 ou autre chose) est utilisé avec : | ||
- enchaînements conditionnels : | - enchaînements conditionnels : | ||
- | - les tests ( commande test, double crochets, if/else, case) | + | - les tests ( commande ''test'', ''<nowiki>[[ ]]</nowiki>'', ''if/else'', ''case'') |
==== L'enchaînement conditionnel est fondé sur le code de retour==== | ==== L'enchaînement conditionnel est fondé sur le code de retour==== | ||
- | **Parmi les opérateurs d'enchaînement de commandes ** | + | Parmi les opérateurs d'enchaînement de commandes ci-dessous :\\ |
(voir : [[atelier:chantier:bash-les-differents-caracteres-speciaux#les-operateurs-de-controle|les opérateurs de contrôle]]) | (voir : [[atelier:chantier:bash-les-differents-caracteres-speciaux#les-operateurs-de-controle|les opérateurs de contrôle]]) | ||
<code> | <code> | ||
|| && ; <retour-chariot> | || && ; <retour-chariot> | ||
</code> | </code> | ||
- | **est basé utilise le code de retour :** | + | ceux fonctionnant sur le code de retour, sont : |
- | - L'opérateur **"&&"** : avec cet opérateur, chaque commande d'une suite est exécuté l'une après l'autre si le code retour de la première est 0 (c'est-à-dire si elle a fonctionné).\\ | + | - l'opérateur ''et'', ''cmd1 && cmd2'' : avec cet opérateur, la commande 2 est exécutée si le code retour de la commande 1 est ''0'' (c'est-à-dire, si elle a fonctionné). |
+ | - l'opérateur ''ou'', ''cmd1 || cmd2'' : la commande 2 est exécutée si le code de retour de la première est __différente de zéro__, c'est-à-dire si elle n'a pas fonctionné. | ||
- | - L'opérateur **||** : la commande suivante est exécutée si le code de retour de la première est différente de zéro, c'est-à-dire si elle n'a pas fonctionné. | + | * Exemple : |
- | Exemple : soit le dossier "Mon-dossier" non-vide; le dossier "mon-dossier" vide; et le dossier "mondossier" inexistant. | + | Soit le dossier "Mon-dossier" non-vide; le dossier "mon-dossier" vide; et le dossier "mondossier" inexistant. |
<code bash> | <code bash> | ||
Ligne 66: | Ligne 72: | ||
( [ $reponse == oui ] && echo " le dossier va être créé" ) #; && mkdir ~/mondossier | ( [ $reponse == oui ] && echo " le dossier va être créé" ) #; && mkdir ~/mondossier | ||
</code> | </code> | ||
- | (Les antislash ne sont pas obligatoires, ils servent à rendre plus lisible les longues commandes qui se suivent sur une ligne.\\ | + | >Les antislash ne sont pas obligatoires, ils servent à rendre plus lisible les longues commandes qui se suivent sur une ligne. |
- | On inhibe là le <retour-chariot> !) | + | >On inhibe là le ''<retour-chariot>'' ! |
<note> | <note> | ||
- | Les opérateurs && et || s'utilisent comme les opérateurs binaires.\\ | + | Les opérateurs ''&&'' et ''||'' s'utilisent comme les opérateurs binaires.\\ |
- | Avec eux eux, c'est soit 0 soit autre chose que 0.\\ | + | Avec eux eux, c'est soit ''0'' soit autre chose que ''0'', c'est-à-dire ''1'', ou encore soit vrai, soit faux.\\ |
Voir la liste des [[atelier:chantier:page-man-bash-iv-symboles-dans-les-calculs-mathematiques#operateurs-binaires|opérateurs binaires]] | Voir la liste des [[atelier:chantier:page-man-bash-iv-symboles-dans-les-calculs-mathematiques#operateurs-binaires|opérateurs binaires]] | ||
</note> | </note> | ||
- | ====3) Inverser le code de retour de la sortie d'une commande==== | + | ====Inverser le code de retour de la sortie d'une commande==== |
<code> | <code> | ||
! commande | ! commande | ||
</code> | </code> | ||
- | Exemple. | + | * Exemple : |
<code user> | <code user> | ||
whoami | whoami | ||
</code> | </code> | ||
- | puis | + | |
<code user> | <code user> | ||
echo $? | echo $? | ||
</code> | </code> | ||
- | retour : 0 | + | <code> |
+ | 0 | ||
+ | </code> | ||
<code user> | <code user> | ||
! whoami | ! whoami | ||
</code> | </code> | ||
- | puis | + | |
<code user> | <code user> | ||
echo $? | echo $? | ||
</code> | </code> | ||
- | retour : 1 | + | <code> |
+ | 1 | ||
+ | </code> | ||
==== Utiliser la commande exit ==== | ==== Utiliser la commande exit ==== | ||
- | * Syntaxe : | + | * Syntaxe : ''exit nombre'' |
- | exit + nombre (nombre de 1 à 3 chiffre(s).) | + | >Avec un nombre de 1 à 3 chiffre(s). |
| | ||
- | ==="exit" permet de remplacer le code de retour de la dernière commande d'un script.=== | + | ===La commande "exit" === |
- | + | ''exit'' permet de remplacer le code de retour de la dernière commande d'un script. | |
- | **exemples** | + | * Exemples : |
Dans ce script, puisque la correspondance est juste, la commande "exit 1" est exécutée, et on sort du programme. | Dans ce script, puisque la correspondance est juste, la commande "exit 1" est exécutée, et on sort du programme. | ||
<code bash> | <code bash> | ||
Ligne 116: | Ligne 127: | ||
</code> | </code> | ||
- | retour | ||
<code> | <code> | ||
bonjour est correspond à bonjour | bonjour est correspond à bonjour | ||
Ligne 125: | Ligne 135: | ||
echo $? | echo $? | ||
</code> | </code> | ||
- | retour : 1 | + | <code> |
+ | 1 | ||
+ | </code> | ||
==="exit" force à sortir du programme=== | ==="exit" force à sortir du programme=== | ||
Ligne 143: | Ligne 155: | ||
echo "$var" | echo "$var" | ||
</code> | </code> | ||
- | retour : | + | |
<code> | <code> | ||
bonjour ne correspond pas à coucou | bonjour ne correspond pas à coucou | ||
Ligne 160: | Ligne 172: | ||
exit 0 | exit 0 | ||
</code> | </code> | ||
- | retour : | ||
<code> | <code> | ||
Ligne 167: | Ligne 178: | ||
===Convention et sortie de programme par défaut=== | ===Convention et sortie de programme par défaut=== | ||
- | **Par convention on finit un script par exit 0**\\ | + | >Par convention on finit un script par ''exit 0'' |
+ | >Si on ne finit pas par ''exit 0'', il s'exécute un ''exit $?'' par défaut, ce qui est équivalent à un ''exit'' (tout court). | ||
- | **Si on ne finit pas par exit 0, il s'exécute un exit $?, ce qui est équivalent à un exit (tout court)** | ||
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
Ligne 178: | Ligne 189: | ||
exit 13 | exit 13 | ||
</code> | </code> | ||
- | |||
- | retour : | ||
<code> | <code> | ||
Ligne 185: | Ligne 194: | ||
127 | 127 | ||
</code> | </code> | ||
+ | * Ou encore : | ||
<code user> | <code user> | ||
echo $? | echo $? | ||
</code> | </code> | ||
- | retour : 13 | + | <code> |
+ | 13 | ||
+ | </code> | ||
===== État de sortie et les tests===== | ===== État de sortie et les tests===== | ||
===À savoir :=== | ===À savoir :=== | ||
Ligne 198: | Ligne 209: | ||
<note tip> | <note tip> | ||
- | **Attention au signe =** | + | **Attention au signe ''=''** |
- | Ne pas confondre le signe = de l'affectation d'une variable par une valeur (voir ci-dessus [[atelier:chantier:debuter-avec-les-scripts-shell-bash#affectation-directe|affectation directe]])\\ avec l'opérateur de correspondance = (ou == ) utilisé dans les tests.\\ | + | Ne pas confondre le signe ''='' de l'affectation d'une variable par une valeur (voir ci-dessus [[atelier:chantier:debuter-avec-les-scripts-shell-bash#affectation-directe|affectation directe]])\\ avec l'opérateur de correspondance ''='' (ou ''=='' ) utilisé dans les tests.\\ |
- | Dans les tests sur les entiers l'égalité est représentée par l'option -eq ! | + | Dans les tests sur les entiers l'égalité est représentée par l'option ''-eq'' ! |
</note> | </note> | ||
Ligne 207: | Ligne 218: | ||
De même que la composition de commandes vu plus haut, on se sert de la composition avec les tests. Et oui les doubles crochets et la commande test sont des commandes ! LOL | De même que la composition de commandes vu plus haut, on se sert de la composition avec les tests. Et oui les doubles crochets et la commande test sont des commandes ! LOL | ||
- | * séquentielle : cmd1 ; cmd2 | + | * séquentielle : ''cmd1 ; cmd2'' |
- | * parallèle : cmd1 & cmd2 | + | * parallèle : ''cmd1 & cmd2'' |
- | * sur erreur (ou) : cmd1 || cmd2 | + | * sur erreur (ou) : ''cmd1 || cmd2'' |
- | * sur succès (et) : cmd1 && cmd2 | + | * sur succès (et) : ''cmd1 && cmd2'' |
* rappel des options des commandes de test : | * rappel des options des commandes de test : | ||
- | - -z $chaine : teste si la variable ne contient rien | + | - ''-z $chaine'' : teste si la variable ne contient rien |
- | - -n $chaine : teste si la variable contient quelque-chose | + | - ''-n $chaine'' : teste si la variable contient quelque-chose |
<code bash> | <code bash> | ||
Ligne 247: | Ligne 258: | ||
===Alternatives : case et paramètres passés aux scripts=== | ===Alternatives : case et paramètres passés aux scripts=== | ||
<note tip> | <note tip> | ||
- | Attention case n'utilise pas d'expression régulière, il s'agit plutôt de "pattern matching" | + | Attention, ''case'' n'utilise pas d'expression régulière, il s'agit plutôt de "pattern matching".\\ |
+ | Voir : [[http://bash.leyan.org/Cours+5+-+bash+II#Structure_conditionnelle_i_case_i_| les symboles reconnus par cases sont ceux servant à la manipulation des fichiers]]. | ||
</note> | </note> | ||
* syntaxe de case : | * syntaxe de case : | ||
Ligne 258: | Ligne 270: | ||
esac | esac | ||
</code> | </code> | ||
- | * explications : | + | * Explications : |
- case "teste" la valeur du paramètre passé au script avec chaque "expression" ; | - case "teste" la valeur du paramètre passé au script avec chaque "expression" ; | ||
- | - et en fonction du test il y a exécution ou pas des commandes placées au niveau de "instructions" ; | + | - et en fonction de la réussite ou de l'échec du test, il y a exécution ou non des commandes placées au niveau de "instructions" ; |
- Case sert à conditionner l'exécution des commandes en fonction d'argument choisi ; | - Case sert à conditionner l'exécution des commandes en fonction d'argument choisi ; | ||
- On se sert de "l'étoile" pour permettre que soit exécuter quelque chose quand n'importe quel autre paramètre que ceux des expressions, est passé au script; | - On se sert de "l'étoile" pour permettre que soit exécuter quelque chose quand n'importe quel autre paramètre que ceux des expressions, est passé au script; | ||
Ligne 314: | Ligne 326: | ||
====Tests sur les valeurs déclarées dans le script==== | ====Tests sur les valeurs déclarées dans le script==== | ||
=== Avec la structure conditionnelle if === | === Avec la structure conditionnelle if === | ||
- | Voir [[doc:programmation:shell:avancee#instruction-conditionnelle-if|structure conditionnelle if]] pour ce qui suit.\\ | + | |
- | Avec la structure conditionnelle if sur des valeurs affectés dans le script | + | Avec la structure conditionnelle if, on peut aussi faire des tests sur la (les) valeur(s) déclarée(s) dans le script. |
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
Ligne 347: | Ligne 358: | ||
Pour modifier la valeur d'une variable d'un script (que le script appelle une valeur extérieure; chaîne de caractère donnée par le terminale, récupération du résultat d'une commande, contenu d'un fichier, etc. ou que cette variable soit affectée dans le script lui-même) on utilise les boucles [[doc:programmation:shell:avancee#boucle-tant-que-while|while]] et [[doc:programmation:shell:avancee#boucle-pour-tout-for|for]].\\ | Pour modifier la valeur d'une variable d'un script (que le script appelle une valeur extérieure; chaîne de caractère donnée par le terminale, récupération du résultat d'une commande, contenu d'un fichier, etc. ou que cette variable soit affectée dans le script lui-même) on utilise les boucles [[doc:programmation:shell:avancee#boucle-tant-que-while|while]] et [[doc:programmation:shell:avancee#boucle-pour-tout-for|for]].\\ | ||
- | On peut aussi modifier la valeur d'une variable d'un script, en exportant depuis le terminal une nouvelle valeur (voir [[http://wiki.debian-facile.org/atelier:chantier:script-bash-variables-arguments-parametres#exportation-de-la-valeur-d-une-variable|"export"]] ) | + | On peut aussi modifier la valeur d'une variable d'un script, en exportant depuis le terminal une nouvelle valeur (voir [[atelier:chantier:script-bash-variables-arguments-parametres#exportation-de-la-valeur-d-une-variable|"export"]] ) |
</note> | </note> | ||
+ | =====La suite c'est ici===== | ||
+ | [[atelier:chantier:script-bash-les-tableaux|script-bash-les-tableaux]] |