User Tools

Site Tools


informatique:linux:programmation_shell

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
informatique:linux:programmation_shell [2018/12/06 15:24] – [read] process substitution pteuinformatique:linux:programmation_shell [2019/04/24 07:53] – [pipe ("|")] pteu
Line 123: Line 123:
   * ''${TAB[0]}'' : contenu du premier enregistrement du tableau TAB   * ''${TAB[0]}'' : contenu du premier enregistrement du tableau TAB
   * ''$TAB'' : équivalent de ''${TAB[0]}''   * ''$TAB'' : équivalent de ''${TAB[0]}''
-  * ''${TAB[*]}'' : désigne l'ensemble des enregistrements du tableau TAB+  * ''${TAB[*]}'' ou ''${TAB[@]}'' : désigne l'ensemble des enregistrements du tableau TAB
  
 Comme pour les variables classiques, on peut récupérer la longueur en le précèdent de ''#'' : Comme pour les variables classiques, on peut récupérer la longueur en le précèdent de ''#'' :
Line 129: Line 129:
   * taille du tableau (nombre de case de celui-ci) : ''${#TAB[*]}'' (ou ''${#TAB[@]}'')   * taille du tableau (nombre de case de celui-ci) : ''${#TAB[*]}'' (ou ''${#TAB[@]}'')
  
 +Pour parcourir facilement un tableau dans une boucle :
 +<code bash>
 +ARRAY=( un deux trois )
 +for i in "${ARRAY[@]}"; do echo $i; done
 +un
 +deux
 +trois
 +</code>
 ====Tableau à 2 dimensions==== ====Tableau à 2 dimensions====
  
-Cela n'existe pas sous bash. Mais on peut l'émuler en créant un tableau associatif (qui, à une clé fait correspondre un contenu), en codant la clé pour émuler 2 dimensions. Exemple : pour émuler un tableau de 2 x 3 cases :+Ça n'eût pas existé pas sous bash :). Mais on peut l'émuler en créant un tableau associatif (qui, à une clé fait correspondre un contenu), en codant la clé pour émuler 2 dimensions. Exemple : pour émuler un tableau de 2 x 3 cases :
 <code bash> <code bash>
 # déclaration d'un tableau associatif T # déclaration d'un tableau associatif T
Line 235: Line 243:
 ======Les fonctions====== ======Les fonctions======
  
 +=====pipe ("|")=====
 +
 +Le pipe (tube) est une fonction qui permet de chainer la sortie d'une première commande sur l'entrée de la seconde (c'est un tube/canal inter-processus).
 +<code bash>
 +echo "toto et tata" | awk '{$3}'
 + tata
 +</code>
 +
 +Le soucis c'est qu'on ne récupère que le code de retour de la dernière commande du pipe ; et dans l'exemple précédent, awk renvoie toujours 0. Pour résoudre ce soucis, on peut :
 +  * récupérer les codes de retour de chaque commande dans le tableau ''$PIPESTATUS'' (spécifique à bash) :
 +<code bash>
 +false | true
 +echo "${PIPESTATUS[@]}"
 + 1 0
 +</code>
 +  * utiliser la variable ''$pipefail'' (ksh, zsh ou bash) qui va enregistrer le code de retour de la dernière commande qui se terminera en erreur (retour != 0) ; ou à défaut, vaudra 0 si toutes se terminent correctement :
 +<code bash>
 +$ false | true; echo $?
 +0
 +$ set -o pipefail
 +$ false | true; echo $?
 +1
 +</code>
 ===== read ===== ===== read =====
  
Line 243: Line 274:
 Pour afficher un texte avant la saisie on utilise ''-p'' ; on peut récupérer plusieurs saisie d'un seul coup : Pour afficher un texte avant la saisie on utilise ''-p'' ; on peut récupérer plusieurs saisie d'un seul coup :
 <code bash> <code bash>
-read -p "Quel est le nombre indique sur votre CB ? Et le cryptogramme visuel de derrière ?" CARD_NUMBER CRYPTO+read -p "Quel est le numéro de ta CB ? Et le cryptogramme visuel de derrière ?" CARD_NUMBER CRYPTO
 </code> </code>
  
Line 250: Line 281:
 read < fichier.txt read < fichier.txt
  
-souvent utilisé dans une boucle while +c'est plutôt utilisé dans une boucle whilepour le lire ligne par ligne :
-# exemple pour afficher le fichier ligne par ligne :+
 while read line; do while read line; do
   echo $line   echo $line
Line 268: Line 298:
 done done
 </code> </code>
-Le premier exemple utilise une [[https://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html#Process-Substitution|process substitution]], qui permet de référencer l'entrée (''>(list)'') ou la sortie (''<(list)'') d'une commande comme un fichier et non plux un flux ; le second un pipe, mais les 2 se valent.+Le premier exemple utilise une [[https://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html#Process-Substitution|process substitution]], qui permet de référencer l'entrée (''>(list)'') ou la sortie (''<(list)'') d'une commande comme un fichier et non plus un flux ; le second un pipe, mais les 2 se valent.
  
 Pour lire depuis une variable : Pour lire depuis une variable :
Line 367: Line 397:
  
 ====Chaînes de caractères==== ====Chaînes de caractères====
-  * ''str1 = str2'' +  * ''"str1"str2"'' : teste l'égalité des 2 chaînes 
-  * ''str1 != str2''+  * ''"str1!= "str2"'' : teste la différence des 2 chaînes 
 +  * ''"str1" =~ regex'' : teste si str1 matche l'expression régulière regex (doit être inclus dans une condition ''<nowiki>[[ .. ]]</nowiki>''
   * ''-z str'' : vrai si chaîne de longueur nulle   * ''-z str'' : vrai si chaîne de longueur nulle
   * ''-n str'' : vrai si chaîne de longueur non nulle    * ''-n str'' : vrai si chaîne de longueur non nulle 
Line 423: Line 454:
 Affichera : ''1 2 3 4 5 ''. Affichera : ''1 2 3 4 5 ''.
  
-Cela équivaut à : ''for i in {1..5}'' qui est une autre façon d'incrémenter i de 1 à 5.+Cela équivaut à : ''for i in {1..5}'' qui est une autre façon simplifiée d'incrémenter i de 1 à 5. Cette méthode ne permet pas d'utiliser des variables ; pour cela il faut utiliser l'expression longue : 
 +<code bash> 
 +DEBUT=1 
 +FIN=5 
 +for (( i = $DEBUT; i <= $FIN; i++ )) 
 + 
 +# ne fonctionne pas : for i in {$DEBUT..$FIN} 
 +</code>
  
 On peut aussi lui fournir une liste de mots : On peut aussi lui fournir une liste de mots :
informatique/linux/programmation_shell.txt · Last modified: 2023/10/02 13:35 by pteu