BASH: Identifier une variable tableau

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 ‹ ] › » 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.

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

2 J'aime

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

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

1 J'aime

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.

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 ‹ 18 ›, 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[*]}

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 ».


Un peu de lecture :

1 J'aime

Bonjour

En me basant sur le contenu de la page web accessible par le lien donné par 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)

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:~$ 
1 J'aime

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

1 J'aime

Excellent,
cette ligne:

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

merci à tous

À 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…