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 [03/06/2014 14:41] Hypathie [F ) Valeurs d'une variable internes ou externes à un script] |
doc:programmation:shells:debuter-avec-les-scripts-shell-bash [03/06/2014 15:49] Hypathie [Redirections dans les scripts] |
||
---|---|---|---|
Ligne 360: | Ligne 360: | ||
* **Voir "l'exemple 4.3. Affectation de variable, basique et plus élaborée" du : [[http://abs.traduc.org/abs-fr/ch04s02.html|Guide avancé d'écriture des scripts Bash : "4.2. Affectation d'une variable"]]** | * **Voir "l'exemple 4.3. Affectation de variable, basique et plus élaborée" du : [[http://abs.traduc.org/abs-fr/ch04s02.html|Guide avancé d'écriture des scripts Bash : "4.2. Affectation d'une variable"]]** | ||
* ** Voir "Variable nulle et variable non-déclarée dans l'exemple "4.4. Entier ou chaîne de caractères ?" du : [[http://abs.traduc.org/abs-fr/ch04s03.html|Guide avancé d'écriture des scripts Bash : "4.3. Les variables Bash ne sont pas typées"]]** | * ** Voir "Variable nulle et variable non-déclarée dans l'exemple "4.4. Entier ou chaîne de caractères ?" du : [[http://abs.traduc.org/abs-fr/ch04s03.html|Guide avancé d'écriture des scripts Bash : "4.3. Les variables Bash ne sont pas typées"]]** | ||
+ | |||
+ | <note tip> | ||
+ | Pour concaténer les valeurs deux variables : | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | var1=lala | ||
+ | var2=li | ||
+ | var3=$var1$var2 | ||
+ | echo $var3 | ||
+ | </code> | ||
+ | </note> | ||
====2) Affectation par la lecture : read ==== | ====2) Affectation par la lecture : read ==== | ||
Ligne 505: | Ligne 516: | ||
</code> | </code> | ||
Voir : [[http://abs.traduc.org/abs-fr/ch21.html|Guide avancé d'écriture des scripts Bash: 21. Sous-shells]] | Voir : [[http://abs.traduc.org/abs-fr/ch21.html|Guide avancé d'écriture des scripts Bash: 21. Sous-shells]] | ||
+ | |||
+ | =====Redirections dans les scripts===== | ||
+ | *Prérequis : [[doc:programmation:shell:shell#rediriger-l-affichage]] et le lien qu'on y trouve [[doc:programmation:shell:chevrons]] | ||
+ | |||
+ | ====Rappels :==== | ||
+ | |||
+ | Les redirections permettent de travailler non pas en se servant du code de retour (qui indique la réussite ou l'échec de l'exécution d'une commande) mais sur le résultat d'une commande.\\ | ||
+ | Un processus unix possède (par défaut) trois voies d'interaction entre le système et l'utilisateur. Une entrée et deux sorties. Chacun de ces "lieux" sont identifiés par un descripteur de fichier. | ||
+ | -une entrée standard (par défaut le clavier stdin), de descripteur 0 (nom de l'entrée du processus, ne pas confondre avec le code de retour !); | ||
+ | -une sortie standard (par défaut l'écran stdout), de descripteur 1 ; | ||
+ | -une sortie standard pour les message d'erreur (stderr) de descripteur 2. | ||
+ | |||
+ | Pour chaque programme lancé, un flux est créé. Ce flux est une sorte de canal par lequel transite les données entre les espaces, entrée et sortie.\\ | ||
+ | On peut imaginer un terminal, comme la réunion virtuelle d'un clavier et d'un écran. | ||
+ | **Merci à captnfab pour cette comparaison sur IRC** :-D | ||
+ | <code bash> | ||
+ | <&- <&- # Permettent la fermeture de l'entrée standard et de la sortie standard. | ||
+ | >| # Force une redirection vers un fichier.txt pour pouvoir écraser | ||
+ | le fichier quand il existe et que l'option noclobber (-c) est activée. | ||
+ | </code> | ||
+ | ====1) opérateurs de sortie : ==== | ||
+ | <code bash> | ||
+ | > : crée un fichier ou le réactualise ; redirige le canal choisi vers un fichier et force sa création, | ||
+ | si le fichier existe son contenu est recrée et numéro d'inode du fichier d'origine est conservé. | ||
+ | </code> | ||
+ | <code bash> | ||
+ | ls -l >chemin-fichier.txt | ||
+ | </code> | ||
+ | est un équivalent de : | ||
+ | <code bash> | ||
+ | ls -l 1> chemin-fichier.txt | ||
+ | </code> | ||
+ | ===Dans un script :=== | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | # mise en place : | ||
+ | { mkdir ~/ABCD ; cd ABCD ; touch a b c d ; cd ~ ; pwd ;} | ||
+ | |||
+ | # création de fichier avec " > " : | ||
+ | cd ~/ABCD && > fichier1 && pwd ; cd ~ && pwd && > /home/hypathie/ABCD/fichier2 && pwd && cd ~ && pwd | ||
+ | # espace facultatif avant et après " > " | ||
+ | |||
+ | # redirection de la sortie de commande vers un fichier : | ||
+ | ls>/home/hypathie/ABCD/recup-ls # espace facultatif avant et après " > " | ||
+ | </code> | ||
+ | |||
+ | Retour : | ||
+ | <code bash> | ||
+ | /home/hypathie # après cd ~ on est retourné dans le répertoire de l'utilisateur | ||
+ | /home/hypathie/ABCD # après création du fichier1 on est encore dans "ABCD" | ||
+ | /home/hypathie # après cd ~ on est retourné dans le répertoire utilisateur | ||
+ | /home/hypathie # on a créé fichier2 dans "ABCD" depuis le répertoire utilisateur | ||
+ | /home/hypathie | ||
+ | </code> | ||
+ | <note important> | ||
+ | Attention: | ||
+ | Créer un fichier avec > est un bashisme. La méthode universelle est d'utiliser "touch". | ||
+ | Amateurs de magie blanche et noire voir ce fil : [[http://debian-facile.org/viewtopic.php?pid=86634#p86634]] | ||
+ | </note> | ||
+ | *redirection de commande vers un fichier, si le fichier existe, les données sont ajoutées à la suite du fichier. | ||
+ | <code bash> | ||
+ | >> | ||
+ | </code> | ||
+ | |||
+ | *La sortie standard d'erreur peut être dirigée vers un fichier en le créant ou en l'écrasant : | ||
+ | <code bash> | ||
+ | ls vi 2>err # retour du prompt : le message d'erreur a été inscrit | ||
+ | dans le fichier "erreurs" qui s'est créé s'il n'existait pas. | ||
+ | </code> | ||
+ | * On peut aussi concaténer : | ||
+ | <code bash> | ||
+ | 2>>fichier # si "fichier" n'existait pas le message | ||
+ | d'erreur aurait été ajouté en dernière ligne. | ||
+ | </code> | ||
+ | *Elle peut aussi être dirigée vers le fichier "poubelle" ou "puits" : | ||
+ | <code bash> | ||
+ | 2>/dev/null | ||
+ | </code> | ||
+ | (Tout ce qui y est dirigé est perdu, inutile de concaténer !) | ||
+ | On s'en sert souvent lorsqu'on est intéressé par le fait de récupérer le code de retour. | ||
+ | |||
+ | *redirection de la sortie d'une commande vers un autre canal : | ||
+ | <code bash> | ||
+ | >& | ||
+ | </code> | ||
+ | <code bash> | ||
+ | ls -l 1>&2 la sortie du répertoire courant et envoyé sur le canal de sortie d'erreur ; | ||
+ | cela à pour effet, de lister le contenu, mais le terminal affiche alors le canal | ||
+ | de sortie d'erreur. Relancer la dernière commande est impossible. | ||
+ | On peut lancer une autre commande, ou faire ctrl+c. Oouffff | ||
+ | </code> | ||
+ | * Pour diriger la sortie standard et la sortie d'erreur à la fin d'un fichier : | ||
+ | <code bash> | ||
+ | >>& | ||
+ | </code> | ||
+ | * Pour rediriger la sortie standard des messages d'erreur (stderr) vers la sortie standard #(stdout), on utilise la syntaxe : | ||
+ | <code bash> | ||
+ | 2>&1 | ||
+ | </code> | ||
+ | |||
+ | Par exemple : | ||
+ | |||
+ | <code bash> | ||
+ | ##vi: /usr/bin/vi | ||
+ | ls vi 2>&1 2>erreurs # retour du prompt on retrouve le message d'erreurs | ||
+ | dans le fichier "erreurs" qui s'est créé. | ||
+ | Cela un équivalent de ls vi 2>err | ||
+ | </code> | ||
+ | |||
+ | <code bash> | ||
+ | ls vi erreur>errrrr 2>&1 #retour du prompt | ||
+ | ls ne peut lister le fichier vi ; le message d'erreur | ||
+ | est envoyé dans le fichier "errrr" qui est nouvellement créé | ||
+ | et qui est la sortie standard (1), | ||
+ | puis ls ne peut lister le fichier "erreur", le message est | ||
+ | envoyé vers la sortie d'erreur qui est redirigé vers (1) | ||
+ | c'est-à-dire le fichier "erreur". | ||
+ | </code> | ||
+ | ====2)Opérateurs d'entrée : ==== | ||
+ | <code bash> | ||
+ | < Place, en entrée d'une commande, un contenu. | ||
+ | </code> | ||
+ | <code bash> | ||
+ | cat < /chemin/du/fichier.txt # est un équivalent de cat /chemin/du/fichier.txt | ||
+ | </code> | ||
+ | <code bash> | ||
+ | << Redirige en entrée une série de données. | ||
+ | </code> | ||
+ | On nomme cette redirection "label".\\ Redirection utilisée dans un document en ligne dont on se sert que pour certaines commandes, comme ftp ou cat.\\ Voir : [[http://abs.traduc.org/abs-5.0-fr/ch18.html#heredocref]]\\ | ||
+ | Ne pas confondre avec la commande e2label, voir : [[doc:systeme:e2label]] | ||
+ | |||
+ | ====3) Un petit exercice sur opérateurs ==== | ||
+ | Écrire un script qui crée le dossier "ABCD" et 4 fichiers vides (nommés a b c d) ; | ||
+ | qui liste le contenu de "ABCD" et qui inscrit le résultat dans un fichier nommé "ls1" qui sera placé dans "ABCD" ; | ||
+ | qui depuis le répertoire personnel crée le fichier vide nommé "fichier.txt",\\ liste à nouveau ABCD, inscrit le résultat dans le fichier "ls2", rangé dans "ABCD"; | ||
+ | qui permet d'inscrire depuis le terminal une ligne de texte dans le fichier nommé "fichier.txt" ; | ||
+ | puis une deuxième ligne de texte dans "fichier.txt", en affichant dans le terminal,\\ le nombre de lignes, de mots et d'octets que possède le fichier "fichier.txt" ; | ||
+ | se servir de différentes méthodes tout au long du script pour vérifier\\ au niveau du terminal que chaque commande s'est bien déroulée. | ||
+ | |||
+ | |||
+ | Bonne lecture ;-) | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | set -o posix | ||
+ | { mkdir ~/ABCD 2>>/dev/null ;\ | ||
+ | echo $? ;\ | ||
+ | cd ABCD && touch a b c d ;\ | ||
+ | echo $? ;\ | ||
+ | ls -l >> ~/ABCD/ls1 ;\ | ||
+ | echo $? ;\ | ||
+ | cd ~ ;\ | ||
+ | pwd ;\ | ||
+ | touch ~/ABCD/fichier.txt ;\ | ||
+ | echo $? ;\ | ||
+ | pwd && ls -l ~/ABCD >> ~/ABCD/ls2 ;\ | ||
+ | echo $? ;\ | ||
+ | read phrase1 && echo ${phrase1} >> ~/ABCD/fichier.txt && echo $? ;\ | ||
+ | read phrase2 ;\ | ||
+ | cat >> ~/ABCD/fichier.txt << EOF | ||
+ | $phrase2 | ||
+ | EOF | ||
+ | echo $? | ||
+ | cat < ~/ABCD/fichier.txt | wc | ||
+ | echo $? ;} | ||
+ | </code> | ||
+ | Retour : | ||
+ | <code> | ||
+ | 0 | ||
+ | 0 | ||
+ | 0 | ||
+ | /home/hypathie | ||
+ | 0 | ||
+ | /home/hypathie | ||
+ | 0 | ||
+ | J'écris un script, | ||
+ | 0 | ||
+ | avec les opérateurs de redirection. | ||
+ | 0 | ||
+ | 2 8 57 | ||
+ | 0 | ||
+ | </code> | ||
+ | |||
+ | * **2>>/dev/null** : permet ici de relancer le script autant de fois qu'on veut, sans voir apparaître de message d'erreur : mkdir fichier-existant ne réinitialise pas un fichier de type dossier en le vidant. | ||
+ | * **$?** : permet ici de vérifier que la commande précédente s'est déroulée avec succès quand "**;**" a été utilisé, inutile de vérifier avec **&&**. | ||
=====E ) État de sortie et les tests===== | =====E ) État de sortie et les tests===== | ||
====1) le code de retour ==== | ====1) le code de retour ==== | ||
Ligne 596: | Ligne 791: | ||
</code> | </code> | ||
- | ===Composition avec les tests; valeurs (vide ou nulle) déclarées dans le script === | + | ===Composition avec les tests; valeurs (vides ou nulles) déclarées dans le script === |
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 | ||
Ligne 709: | Ligne 904: | ||
</note> | </note> | ||
- | =====G ) 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 764: | Ligne 959: | ||
</code> | </code> | ||
- | =====H ) 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 881: | Ligne 1076: | ||
</code> | </code> | ||
- | =====I ) 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 986: | Ligne 1181: | ||
Voir le tableau des options ici: http://abs.traduc.org/abs-5.3-fr/ch30.html#optionsref | Voir le tableau des options ici: http://abs.traduc.org/abs-5.3-fr/ch30.html#optionsref | ||
</note> | </note> | ||
+ | =====H) Les tableaux ===== | ||
+ | **Voir : [[atelier:chantier:page-man-bash-v-les-tableaux|shell bash : les tableaux]]** | ||
+ | |||
+ | * **Rappels :** | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | tab=( rouge vert bleu) | ||
+ | echo ${tab[1]} | ||
+ | echo ${tab[@]} | ||
+ | |||
+ | tab[1]="orange" | ||
+ | echo ${tab[1]} | ||
+ | echo ${tab[@]} | ||
+ | |||
+ | echo $tab # $tab est un équivalment de $tab0 : il affichera le première élément | ||
+ | |||
+ | echo ${tab[@]} # affiche tous les éléments de même ${tab[*]} | ||
+ | echo ${#tab[@]} # pour avoir la longueur (nombres d'éléments dans le tableau): ${tab[@]} -1 | ||
+ | (moins un car on commence à zéro! | ||
+ | tab[8]="vert" # nlle affectation sur tab[8] | ||
+ | echo ${!tab[@]} # ! avoir la liste des indices du tableau | ||
+ | echo ${tab[@]} | ||
+ | |||
+ | for i in ${!tab[*]} ; do | ||
+ | echo $i : ${tab[$i]} | ||
+ | done | ||
+ | </code> | ||
+ | |||
+ | * ** Comparez :** | ||
+ | Avec tableau : | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | tableau=([1]=a [2]=b [3]=c) | ||
+ | for var in "${!tableau[@]}" ; do | ||
+ | echo "$var : ${tableau[$var]}" | ||
+ | done | ||
+ | </code> | ||
+ | |||
+ | Le script d'enikar : | ||
+ | |||
+ | <code bash> | ||
+ | set a b c | ||
+ | n=1 | ||
+ | for v in $@ ; do | ||
+ | echo "$n: $v" | ||
+ | let $[ n += 1 ] | ||
+ | done | ||
+ | </code> | ||
+ | **Merci à enikar pour cette réflexion sur IRC** | ||
+ | |||
+ | * astuce : lister avec numérotation tous les fichiers d'un répertoire : | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | directory=(/*) # tableau composé des chemins de les dossiers et fichiers de la racine | ||
+ | |||
+ | for i in ${!directory[@]} ; do | ||
+ | echo "$i : ${directory[$i]}" # là pour afficher tous les éléments du tableau | ||
+ | done | ||
+ | </code> | ||
- | =====J ) Les fonctions===== | + | =====I ) Les fonctions===== |