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:debuter-avec-les-scripts-shell-bash [31/05/2014 19:26] Hypathie [Comment créer et exécuter un script ?] |
doc:programmation:shells:debuter-avec-les-scripts-shell-bash [03/06/2014 12:44] Hypathie [D ) État de sortie et les tests] |
||
---|---|---|---|
Ligne 281: | Ligne 281: | ||
**Lors de l'exécution de ce script, la chaîne que vous entrerez pour répondre à la question, sera le nom d'un nouveau script que vous voulez créer.** | **Lors de l'exécution de ce script, la chaîne que vous entrerez pour répondre à la question, sera le nom d'un nouveau script que vous voulez créer.** | ||
- | ===== Création de variables par l'utilisateur===== | + | =====C ) Création de variables ===== |
En liens nécessaires : \\ | En liens nécessaires : \\ | ||
[[doc:programmation:shell:shell#variables-et-environnement|Le shell pour tous : "Variables et environnement"]]\\ | [[doc:programmation:shell:shell#variables-et-environnement|Le shell pour tous : "Variables et environnement"]]\\ | ||
Ligne 426: | Ligne 426: | ||
</note> | </note> | ||
- | ====3) Créer des variables avec les tableaux ==== | ||
- | Les variables de chaque case d'un tableau, ont elles aussi une position définie par l'utilisateur, ou automatiquement lors de la création du tableau.\\ | ||
- | Pour plus de précision sur la création et l'utilisation de tableau dans les scripts voir ici : [[atelier:chantier:page-man-bash-v-les-tableaux]] | ||
- | ====4) création de variables quelques commandes à connaître==== | + | =====D ) État de sortie et les tests===== |
- | ===declare=== | + | ====1) le code de retour ==== |
- | ===let=== | + | 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. |
- | =====Les tests ==== | + | **- L'exécution de tous programmes et de toutes fonctions renvoie une valeur numérique appelée code de retour.** |
- | ====utiliser le code de retour : exit==== | + | |
+ | **- 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.** | ||
- | =====Valeurs d'une variable internes ou externes à un script===== | + | **- 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 :** | ||
+ | <code user> | ||
+ | blabla | ||
+ | </code> | ||
+ | puis | ||
+ | <code user> | ||
+ | echo $? | ||
+ | </code> | ||
+ | Retour : | ||
+ | <code> | ||
+ | 127 | ||
+ | </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. | ||
+ | // | ||
+ | |||
+ | **- L'état de sortie vrai ou faux ( 0 ou autre chose) est utilisé avec :** | ||
+ | |||
+ | - enchaînements conditionnels : | ||
+ | - les tests ( commende test, double crochets, if/else, case) | ||
+ | |||
+ | === enchaînement conditionnel=== | ||
+ | **Parmi les opérateurs d'enchaînement de commandes ** | ||
+ | **(voir : [[atelier:chantier:bash-les-differents-caracteres-speciaux#les-operateurs-de-controle|les opérateurs de contrôle]])** | ||
+ | <code> | ||
+ | || && ; <retour-chariot> | ||
+ | </code> | ||
+ | |||
+ | * **L'opérateur "&&" utilise le code de retour :** 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 "||" utilise le code de retour :** 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 : soit le dossier "Mon-dossier" non-vide; le dossier "mon-dossier" vide; et le dossier "mondossier" inexistant. | ||
+ | <code bash> | ||
+ | cd ~/Mon-dossier && ls # => titi toto | ||
+ | cd ~/mon-dossier || pwd # pas de retour : la première commande renvoie 0 | ||
+ | et rester sur place n'est pas une erreur | ||
+ | cd ~/mondossier 2>/dev/null || echo "le dossier mondossier n'existe pas" && read -p "voulez-vous le créer [oui/non] ? " reponse && ( [ $reponse == non ] && echo " le dossier ne sera pas créé") || ( [ $reponse == oui ] && echo " le dossier va être créé" ) #; && mkdir ~/mondossier | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ===Utiliser la commande exit === | ||
+ | |||
+ | **- syntaxe :** | ||
+ | exit + nombre de 1 à 3 chiffre(s) | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ====2 ) les tests ==== | ||
+ | ===À savoir :=== | ||
+ | |||
+ | * **[[atelier:chantier:la-page-man-bash-ii-les-operateurs-lexicographiques|les opérateurs lexicographiques]] et leur syntaxe** | ||
+ | * **[[atelier:chantier:page-man-bash-iii-les-operateurs-de-comparaison-numerique|les opérateurs de comparaison numérique et leur syntaxe]]** | ||
+ | * ** La commande test ou les crochets :[[atelier:chantier:page-man-bash-iii-les-operateurs-de-comparaison-numerique#conclusion-sur-les-operateurs-lexicographiques-et-les-operateurs-de-comparaison-numerique]]** | ||
+ | * **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]]) et 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 ! | ||
+ | |||
+ | ===Avec la structure conditionnelle if === | ||
+ | **Voir[[doc:programmation:shell:avancee|Fonctionnalités avancées du Shell]] en particulier : [[doc:programmation:shell:avancee#instruction-conditionnelle-if|structure conditionnelle if]] pour ce qui suit** | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | var1=23 | ||
+ | var2=36 | ||
+ | |||
+ | if [ $var1 -eq $var2 ] ; then | ||
+ | echo "$var1 et $var2 sont égales" | ||
+ | else | ||
+ | echo "$var1 et $var2 ne sont pas égales" | ||
+ | fi | ||
+ | |||
+ | if [ $var1 != $var2 ] ; then | ||
+ | echo "$var1 et $var2 sont inégales" | ||
+ | fi | ||
+ | |||
+ | if [ ${#var1} = ${#var2} ] ; then | ||
+ | echo "$var1 et $var2 sont des chaînes de même longueur" | ||
+ | fi | ||
+ | echo "les longueurs sont de : ${#var1} et de : ${#var2}" | ||
+ | </code> | ||
+ | |||
+ | ===composition avec les tests et valeur vide, valeur nulle=== | ||
+ | |||
+ | 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 | ||
+ | * parallèle : cmd1 & cmd2 | ||
+ | * sur erreur (ou) : cmd1 || cmd2 | ||
+ | * sur succès (et) : cmd1 && cmd2 | ||
+ | |||
+ | * rappel des options des commandes de test : | ||
+ | - -z $chaine : teste si la variable ne contient rien | ||
+ | - -n $chaine : teste si la variable contient quelque-chose | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | #var3 est nulle, non déclarée, (ou non initialisée) : sa valeur est nulle | ||
+ | #var2 est initialisée mais sans valeur : sa une valeur vide | ||
+ | var1=ma_variable | ||
+ | var2= | ||
+ | var2bis=" " | ||
+ | |||
+ | [ ${var1} ] && echo "$var1" # => ma_variable | ||
+ | [ -n ${var1} ] && echo "$var1" # => ma_variable | ||
+ | [ -n $var1 ] && echo "$var1" # => ma_variable | ||
+ | #ou encore : | ||
+ | test $var1 && echo "ok" # => ok | ||
+ | test -n $var1 && echo "ok var1 contient quelque-chose" # => ok var1 contient quelque-chose | ||
+ | test -z $var1 || echo "NON: var1 ne contient pas rien" # => NON: var1 ne contient pas rien | ||
+ | echo " " | ||
+ | |||
+ | [ -z $var2 ] && echo "var2: ${#var2} a une valeur vide : ne contient rien" # => var2: 0 a une valeur vide : ne contient rien | ||
+ | [ -n $var2 ] && echo "var2: une valeur vide contient 0 : du vide !" # => var2: une valeur vide contient 0 : du vide ! | ||
+ | [ -z $var2bis ] && echo "var2bis: comme var2" # => var2bis: comme var2 | ||
+ | [ -n $var2bis ] && echo "var2bis: comme var2" # => var2bis: comme var2 | ||
+ | echo " " | ||
+ | [ -n $var3 ] && echo "ET avec -n: une variable nulle contient aussi du vide" # => ET avec -n: une variable nulle contient aussi du vide | ||
+ | [ -n $var3 ] || echo "OU avec -n" # PAS DE RETOUR puisque la première commande a renvoyé le code de retour 0. | ||
+ | [ -z $var3 ] && echo " OU avec -z une variable nulle contient aussi du vide" # => OU avec -z une variable nulle contient aussi du vide | ||
+ | [ -z $var3 ] || echo " OU avec -z" # PAS DE RETOUR puisque la première commande a renvoyé le code de retour 0. | ||
+ | </code> | ||
+ | |||
+ | ===Alternatives : case=== | ||
+ | ** Attention case n'utilise pas d'expression régulière mais du "pattern matching"** | ||
+ | |||
+ | * syntaxe de case : | ||
+ | <code bash> | ||
+ | case $variable in | ||
+ | expression) | ||
+ | instructions | ||
+ | ;; | ||
+ | ... | ||
+ | esac | ||
+ | </code> | ||
+ | * explications : | ||
+ | - 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" ; | ||
+ | - 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; | ||
+ | * Ne pas oublier : | ||
+ | - le double point virgule qui permet de clôturer chaque test ; | ||
+ | - esac pour finir. | ||
+ | * exemple : | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | # passer le paramètre 'coco' à ce script ; puis 'cucu' ; titi puis toto, puis celui que voulez. | ||
+ | case $1 in | ||
+ | coco) | ||
+ | echo "Vous avez passé le paramètre 'coco', ré-essayez avec 'cucu'" | ||
+ | ;; | ||
+ | cucu) | ||
+ | echo "Vous avez passé le paramètre 'cucu'" | ||
+ | echo "un peu d'humour !" | ||
+ | echo "Ré-essayé avec titi, puis avec toto." | ||
+ | ;; | ||
+ | titi|toto) | ||
+ | echo "vous avez passé le paramètre $1" | ||
+ | ;; | ||
+ | *) | ||
+ | echo "Vous avez choisi $1" | ||
+ | esac | ||
+ | </code> | ||
+ | |||
+ | Vous avez tout en mains pour comprendre ceci : [[doc:programmation:shell:avancee#selecteur-case|Fonctionnalités avancées du Shell: selecteur-case]] | ||
+ | |||
+ | =====E ) Valeurs d'une variable internes ou externes à un script===== | ||
====Pré-requis: utiliser la structure conditionnelle if==== | ====Pré-requis: utiliser la structure conditionnelle if==== | ||
Ligne 471: | Ligne 636: | ||
**Mais pour modifier la valeur d'une variable par 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.** | **Mais pour modifier la valeur d'une variable par 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.** | ||
- | =====Déclaration nulle et modification par le script d'une valeur interne ou externe===== | + | =====F ) Déclaration nulle et modification par le script d'une valeur interne ou externe===== |
**Pré-requis : utiliser les structures de contrôle** | **Pré-requis : utiliser les structures de contrôle** | ||
Voir : | Voir : | ||
Ligne 526: | Ligne 691: | ||
</code> | </code> | ||
- | =====Déclarer des paramètres de position : set===== | + | =====G ) Déclarer des paramètres de position : set===== |
==== syntaxe de set==== | ==== syntaxe de set==== | ||
À savoir : variables de substitution prédéfinies [[atelier:chantier:bash-les-differents-caracteres-speciaux?&#variables-de-substitution-predefinies-principalement-dans-les-scripts]] | À savoir : variables de substitution prédéfinies [[atelier:chantier:bash-les-differents-caracteres-speciaux?&#variables-de-substitution-predefinies-principalement-dans-les-scripts]] | ||
Ligne 643: | Ligne 808: | ||
</code> | </code> | ||
- | =====Supprimer les paramètres de position===== | + | =====H ) Supprimer les paramètres de position===== |
====Exemple==== | ====Exemple==== | ||
**même script que ci-dessus mais on dé-commente set - - (on enlève # ligne 5) :** | **même script que ci-dessus mais on dé-commente set - - (on enlève # ligne 5) :** | ||
Ligne 749: | Ligne 914: | ||
</note> | </note> | ||
- | =====Les fonctions===== | + | =====I ) Les fonctions===== |