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 [2020/01/14 09:01] – [Les tableaux] Exemple de découpage d'une chaîne dans un tableau pteuinformatique:linux:programmation_shell [2021/01/04 14:30] – [Les variables] constantes#2 pteu
Line 26: Line 26:
 </code> </code>
 On peut les manipuler sans les déclarer proprement au préalable ; mais on peut être clean et les définir (''declare VAR'') ou les supprimer (''unset VAR''). On peut les manipuler sans les déclarer proprement au préalable ; mais on peut être clean et les définir (''declare VAR'') ou les supprimer (''unset VAR'').
 +
 +Pour déclarer une variable non modifiable = en readonly (une constante) :
 +<code bash>
 +readonly CONST="constante"
 +# ou
 +declare -r CONST="constante"
 +</code>
  
 Par défaut une variable est globale et est vue dans le script (y compris ses fonctions) ; dans une fonction on peut déclarer des variables locales afin d'éviter les écrasements de variables globales non souhaités avec : Par défaut une variable est globale et est vue dans le script (y compris ses fonctions) ; dans une fonction on peut déclarer des variables locales afin d'éviter les écrasements de variables globales non souhaités avec :
Line 31: Line 38:
 local VAR="pwet" local VAR="pwet"
 </code> </code>
 +
 +Pour déclarer une constante locale à une fonction :
 +<code bash>
 +local -r CONST="constante locale"
 +
 +# ou en 2 lignes
 +local CONST="constante locale"
 +readonly CONST
 +
 +# marche aussi, puisque lorsque declare est invoqué dans une fonction,
 +#  la variable qui suit est déclarée localement
 +function test() {
 +  declare -r CONST="constante locale"
 +  }
 +</code>
 +C'est assez touffu je suis d'accord.
 +
 +
 +
 +
  
 ===== Tests de définition===== ===== Tests de définition=====
Line 127: Line 154:
   * ''$!'' renvoie le PID de la dernière commande   * ''$!'' renvoie le PID de la dernière commande
   * ''$?'' renvoie le retour (code d'erreur par exemple) de la dernière commande   * ''$?'' renvoie le retour (code d'erreur par exemple) de la dernière commande
 +  * ''$-'' renvoie la liste des paramètres courts du shell. Pour les interpréter, saisir ''help set'' dans le shell.
  
   * ''IFS="\n"'' (Internal Field Separator) le séparateur de champ est "ENTER" (utilisée par la commande read)   * ''IFS="\n"'' (Internal Field Separator) le séparateur de champ est "ENTER" (utilisée par la commande read)
Line 192: Line 220:
 </code> </code>
  
 +====Tableau associatif====
  
 +Créer et utiliser un vrai tableau associatif :
 +<code bash>
 +declare -A TA=([cle1]=valeur1 ["cle 2"]="valeur 2" [cle3]=valeur3)
 +echo "${TA[cle1]}"
 +# valeur1
 +
 +# Parcourir le tableau
 +for cle in "${!TA[@]}"; do
 +   echo "cle=$cle ; val=${TA[$cle]}"
 +done
 +#cle=cle 2 ; val=valeur 2
 +#cle=cle3 ; val=valeur3
 +#cle=cle1 ; val=valeur1
 +</code>
 +
 +Pour connaitre la taille de ce tableau : ''${#TA[@]}'' (3 dans cet exemple).
 =====getopts : analyse des arguments d'un script===== =====getopts : analyse des arguments d'un script=====
  
Line 415: Line 460:
  
 Pour incrémenter une variable : plusieurs possibilités : Pour incrémenter une variable : plusieurs possibilités :
-  * ''<nowiki>z=`expr $z + 1`</nowiki>'' +  * ''z=`expr $z + 1`'' ou ''z=$(expr $z + 1)'' 
-  * ''<nowiki>z=$(($z+1))</nowiki>'' +  * ''<nowiki>z=$(($z+1))</nowiki>'' ou ''<nowiki>z=$((z+1))</nowiki>'' (entre doubles parenthèses, le $ est optionnel)
-  * ''<nowiki>z=$((z+1))</nowiki>'' (entre doubles parenthèses, le $ est optionnel)+
   * ''<nowiki>(( z += 1 ))</nowiki>''   * ''<nowiki>(( z += 1 ))</nowiki>''
  
Line 512: Line 556:
   * ''n1 -le n2'' plus petit ou égal   * ''n1 -le n2'' plus petit ou égal
  
 +Comme il n'y a pas de typage en bash, pour tester si la valeur d'une variable est un nombre (entier) il faut réaliser le tester :
 +<code bash>
 +# Solution à base de REGEX
 +[[ $VAR =~ ^[0-9]+$ ]] || echo "VAR n'est pas un entier"
 +# NB : l'expression régulière ne doit pas être quotée,
 +#      ou doit être enregistrée dans une variable sinon ça ne matche pas
 +
 +# "auto-test" numérique :)
 +[ $VAR -eq $VAR ] 2>/dev/null || echo "VAR n'est pas un entier"
 +</code>
 ==== Opérateurs ==== ==== Opérateurs ====
   * ''!'' unaire de négation   * ''!'' unaire de négation
Line 811: Line 865:
 </code> </code>
  
-====== Liens ======+====== Ressources ======
  
   * http://abs.traduc.org/abs-5.0-fr/index.html   * http://abs.traduc.org/abs-5.0-fr/index.html
   * http://www.gnu.org/software/bash/manual/bashref.html   * http://www.gnu.org/software/bash/manual/bashref.html
   * [[http://tldp.org/LDP/abs/html/index.html|Advanced Bash-Scripting Guide]]   * [[http://tldp.org/LDP/abs/html/index.html|Advanced Bash-Scripting Guide]]
 +  * https://www.shellcheck.net : super moulinette en ligne pour analyser un script et recommander des améliorations (exsite aussi en package Linux : ''shellcheck''). A utiliser sans modération !
informatique/linux/programmation_shell.txt · Last modified: 2023/10/02 13:35 by pteu