Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
informatique:linux:programmation_shell [2020/01/14 14:58] – [Tableau associatif] pteu | informatique:linux:programmation_shell [2021/01/05 11:52] – [Les tableaux] pteu |
---|
</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 : |
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===== |
* ''$!'' 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) |
Les enregistrements commencent à l'index 0. Ainsi pour récupérer le contenu de la 5ème case on doit utiliser l'index 4. | Les enregistrements commencent à l'index 0. Ainsi pour récupérer le contenu de la 5ème case on doit utiliser l'index 4. |
| |
* ''TAB=( un deux trois )'' : définition d'un tableau de 3 cases | * ''TAB=( un deux trois )'' : définition et remplissage d'un tableau de 3 cases |
* ''TAB[0]=val'' : affectation du premier enregistrement du tableau TAB | * ''TAB[0]=UN'' : affectation du premier enregistrement du tableau TAB |
* ''${TAB[0]}'' : contenu du premier enregistrement du tableau TAB | * ''${TAB[0]}'' ou ''$TAB'' : contenu du premier enregistrement du tableau TAB ("UN") |
* ''$TAB'' : équivalent de ''${TAB[0]}'' | * ''${!TAB[@]}'' liste les indices des cases du tableau ("0 1 2") |
* ''${TAB[*]}'' ou ''${TAB[@]}'' : désigne l'ensemble des enregistrements du tableau TAB | * ''${TAB[-1]}'' dernier élément du tableau ("trois") |
| * ''${TAB[*]}'' ou ''${TAB[@]}'' : désigne l'ensemble des enregistrements du tableau TAB ("un deux trois") |
| * ''${TAB[@]:1:2}'' : désigne un intervalle de case ; entre celle d'indice 1 (TAB[1]) jusqu'à la 2nde lue ("deux trois") |
| * ''TAB=("${TAB[@]}" "quatre")'' ou ''TAB+=("quatre")'' : push (ajout d'un élément à la fin du tableau) |
| * ''unset TAB[3]'' : supprimant la 4ème case |
| * ''TAB=("${TAB[@]/trois/}'' : suppression par expression régulière de la 2ème case ${TAB[2]} |
| * ''TAB=($(cat FILENAME))'' : remplir le tableau avec chaque mot du fichier |
| |
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 ''#'' : |
| |
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>'' |
| |
* ''"str1" = "str2"'' : teste l'égalité des 2 chaînes | * ''"str1" = "str2"'' : teste l'égalité des 2 chaînes |
* ''"str1" != "str2"'' : teste la différence des 2 chaînes | * ''"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>'' | * ''"str1" =~ regex'' : teste si str1 matche l'expression régulière regex (au format extended, comme ''grep -E'') ; le test doit être inclus dans une condition ''<nowiki>[[ .. ]]</nowiki>'' et la chaine str1 doit être double-quotée. Si on utilise des groupes capturants (entre ''(..)'') dans la REGEX, on peut rappeler les matchs avec la variable tableau ''${BASH_REMATCH[x]}'', comme on le ferait avec \1, \2, \3 pour sed. Par exemple : |
| <code bash> |
| [[ "la réponse est 42" =~ ^.*([0-9]{2}).*$ ]] && echo "${BASH_REMATCH[1]} est la réponse" |
| 42 est la réponse |
| </code> |
* ''-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 |
* ''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 |
DEBUT=1 | DEBUT=1 |
FIN=5 | FIN=5 |
for (( i = $DEBUT; i <= $FIN; i++ )) | |
| |
# ne fonctionne pas : for i in {$DEBUT..$FIN} | # ne fonctionne pas : for i in {$DEBUT..$FIN} |
| # fonctionne : |
| for (( i = $DEBUT; i <= $FIN; i++ )) |
</code> | </code> |
| |
| On peut spécifier l'incrément qui vaut par défaut 1, avec : ''for i in {1..5..2}'' (ici incrément de 2). |
| |
On peut aussi lui fournir une liste de mots : | On peut aussi lui fournir une liste de mots : |
</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 ! |