# BASH: Identifier une variable tableau

**URL:** <https://www.debian-fr.org/t/bash-identifier-une-variable-tableau/84582>\
**Category:** Programmation\
**Created:** [Mai 10, 2021, 8:50 UTC](https://www.debian-fr.org/t/bash-identifier-une-variable-tableau/84582 "2021-05-10T08:50:16Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Mai 10, 2021, 8:50 UTC](https://www.debian-fr.org/t/bash-identifier-une-variable-tableau/84582/1 "2021-05-10T08:50:16Z")

</div>

Bonjour à tous  
existe-t-il une façon simple et sure d’identifier la nature d’une variable?  
Le script doit afficher le contenu d’une variable, si c’est une variable scalaire, et si c’est une variable tableau, son nom et le nombre d’éléments qu’elle contient.

Actuellement j’utilise un « grep ‹&nbsp;]&nbsp;› » sur la sortie de « declare », puis un 2e grep pour identifier la variable.

`declare | grep ']' | grep "$var"| cut -d= -f1 >/dev/null`  
`EST_TABLEAU="$?"`  
puis test sur $EST\_TABLEAU

J’espère qu’il peut y avoir une méthode plus propre et plus sure.

---

<div class="post-metadata">

**Author:** ![crustyourmind](https://www.debian-fr.org/user_avatar/www.debian-fr.org/crustyourmind/32/2955_2.png) [@crustyourmind](https://www.debian-fr.org/u/crustyourmind)\
**Post date:** [Mai 10, 2021, 9:31 UTC](https://www.debian-fr.org/t/bash-identifier-une-variable-tableau/84582/2 "2021-05-10T09:31:23Z")

</div>

Bonjour  
Peut être en s’appuyant sur cette fonction  
[https://gist.github.com/CMCDragonkai/f1ed5e0676e53945429b](https://gist.github.com/CMCDragonkai/f1ed5e0676e53945429b)  
?

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Mai 10, 2021, 10:14 UTC](https://www.debian-fr.org/t/bash-identifier-une-variable-tableau/84582/3 "2021-05-10T10:14:13Z")

</div>

`declare -p` tout simplement, comme utilisé dans la fonction indiquée par @crustyourmind

```auto
sputnik@debian:~$ declare --help
declare: declare [-aAfFgilnrtux] [-p] [name[=value] ...]
    Set variable values and attributes.
    
    Declare variables and give them attributes. If no NAMEs are given,
    display the attributes and values of all variables.
    
    Options:
      -f	restrict action or display to function names and definitions
      -F	restrict display to function names only (plus line number and
    		source file when debugging)
      -g	create global variables when used in a shell function; otherwise
    		ignored
      -p	display the attributes and value of each NAME
    
    Options which set attributes:
      -a	to make NAMEs indexed arrays (if supported)
      -A	to make NAMEs associative arrays (if supported)
      -i	to make NAMEs have the `integer' attribute
      -l	to convert the value of each NAME to lower case on assignment
      -n	make NAME a reference to the variable named by its value
      -r	to make NAMEs readonly
      -t	to make NAMEs have the `trace' attribute
      -u	to convert the value of each NAME to upper case on assignment
      -x	to make NAMEs export

```

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Mai 10, 2021, 10:52 UTC](https://www.debian-fr.org/t/bash-identifier-une-variable-tableau/84582/4 "2021-05-10T10:52:29Z")

</div>

Merci spoutnik,  
mais ce qu’affiche _declare_ avec l’option _-p_ est la même chose que _declare_ sans option, telle que je l’utilise dans mon script, à savoir non seulement son type et son nom, mais aussi _tout son contenu_.  
C’est d’ailleurs par son contenu que je l’identifie (le caractère « ] » , donc un tableau déclaré mais vide ne serait sans doute pas identifié comme tel))  
Ce que je cherche, si ça existe, c’est le moyen d’identifier simplement _le type_ de la variable (tableau ou pas)

J’ai corrigé ma ligne avec -p pour plus de sécurité, mais le résultat est identique, efficace.  
Mais comme tout béotien, il est possible que j’ai réinventé la roue.

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Mai 10, 2021, 11:50 UTC](https://www.debian-fr.org/t/bash-identifier-une-variable-tableau/84582/5 "2021-05-10T11:50:47Z")

</div>

> [@josephtux](#):
>
> existe-t-il une façon simple et sure d’identifier la nature d’une variable?

bonjour,  
Primo, c’est bien de demander de l’aide ; ça serait mieux d’être précis à-propos du langage… heureusement, on comprend vite que c’est un langage shell ; mais là, encore, il nous faut supposer que tu parles du Bash.

Il te faut comprendre qu’en shell, généralement, les variables ne sont pas typées ; elles ne sont que des chaînes de caractères !  
Exemple, ce n’est pas parce que tu attribues la valeur ‹&nbsp;18&nbsp;›, que c’est pour autant le chiffre 18, non, ce sera la chaîne de caractères 18 !  
Dans ce cas précis d’exemple, Bash va quand même décider de lui-même que ce sera un entier…  
ce qui peut être sujet à plein d’erreurs.  
De même le principe de variable scalaire n’existe pas.

Tu peux t’assurer que c’est un entier, par exemple avec ce code :

`if ((var)) 2>/dev/null` ou `if let $var 2>/dev/null`

Que c’est un tableau :

`if ${tableau[*]}`

> [@josephtux](#):
>
> ce qu’affiche _declare_ avec l’option _-p_ est la même chose que _declare_ sans option

Là, si c’est vrai, ce n’est pas normal ; car seule l’option ‹&nbsp;p&nbsp;› est prévue pour afficher la valeur de la déclaration et son «&nbsp;type&nbsp;».

* * *

Un peu de lecture :

- [https://linux.die.net/Bash-Beginners-Guide/sect\_10\_01.html](https://linux.die.net/Bash-Beginners-Guide/sect_10_01.html)

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Mai 10, 2021, 11:54 UTC](https://www.debian-fr.org/t/bash-identifier-une-variable-tableau/84582/6 "2021-05-10T11:54:14Z")

</div>

Bonjour

> [@josephtux](#):
>
> …, donc un tableau déclaré mais vide ne serait sans doute pas identifié comme tel))  
> Ce que je cherche, si ça existe, c’est le moyen d’identifier simplement _le type_ de la variable (tableau ou pas)  
> …

En me basant sur le contenu de la page web accessible par le lien donné par [**crustyourmind**](https://www.debian-fr.org/u/crustyourmind)

Si l’argument qu’on lui donne est bien un tableau (vide ou pas vide),  
la fonction **estTableau** ne retournera pas de code d’erreur.

(J’ai mis des commentaires au bout des lignes)

```plaintext
michel@debsid:~$ estTableau () { [[$(declare -p "$1" 2>/dev/null) =~ "declare -a"]]; } # Création de la fonction 'estTableau'
michel@debsid:~$ chaine="" # Création d'une variable de type 'chaîne' vide
michel@debsid:~$ declare -a tableau # Création d'une variable de type 'tableau' vide
michel@debsid:~$ 
michel@debsid:~$ # tests de la fonction 'estTableau' en utilisant les variables ci-dessus
michel@debsid:~$ 
michel@debsid:~$ estTableau chaine && echo "C'est un tableau." || echo "Ce n'est PAS un tableau."
Ce n'est PAS un tableau.
michel@debsid:~$ 
michel@debsid:~$ estTableau tableau && echo "C'est un tableau." || echo "Ce n'est PAS un tableau."
C'est un tableau.
michel@debsid:~$ 

```

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Mai 10, 2021, 1:07 UTC](https://www.debian-fr.org/t/bash-identifier-une-variable-tableau/84582/7 "2021-05-10T13:07:27Z")

</div>

> [@PengouinPdt](#):
>
> ça serait mieux d’être précis à-propos du langage

Oui, désolé pour cet oubli. Il s’agit bien de bash (je l’ajoute dans le titre)

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Mai 10, 2021, 1:13 UTC](https://www.debian-fr.org/t/bash-identifier-une-variable-tableau/84582/8 "2021-05-10T13:13:30Z")

</div>

> [@PengouinPdt](#):
>
> ```plaintext
> if ${tableau[*]}
> 
> ```

Excellent,  
cette ligne:

> [@anon29980398](#):
>
> ```plaintext
> estTableau () { [[$(declare -p "$1" 2>/dev/null) =~ "declare -a"]]; }
> 
> ```

permet même de différencier les type indicés ( -a ) ou associatifs ( -A)

merci à tous

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Mai 10, 2021, 1:27 UTC](https://www.debian-fr.org/t/bash-identifier-une-variable-tableau/84582/9 "2021-05-10T13:27:34Z")

</div>

> [@PengouinPdt](#):
>
> Là, si c’est vrai, ce n’est pas normal ; car seule l’option ‹ p › est prévue pour afficher la valeur de la déclaration et son « type ».

À ce propos, cette assertion n’est vrai («normale?) qu’en l’absence d’argument (de nom de variable), ce qui était le cas de ma ligne de commande declare…
