GNU/Linux >> Tutoriels Linux >  >> Linux

`declare -a A` crée-t-il un tableau vide `a` dans Bash ?

Est-ce que declare -a A créer un tableau vide A dans bash, ou définit-il simplement un attribut dans le cas A est attribué plus tard ?

Considérez ce code :

set -u
declare -a A
echo ${#A[*]}
echo ${A[*]}
A=()
echo ${#A[*]}
echo ${A[*]}
A=(1 2)
echo ${#A[*]}
echo ${A[*]}

Quelle devrait être la sortie attendue ?

Dans Bash 4.3.48(1), j'obtiens bash: A: unbound variable lors de la requête du nombre d'éléments après declare .
J'obtiens également cette erreur lors de l'accès à tous les éléments.
Je sais que les versions ultérieures de Bash traitent cela différemment.
Néanmoins, j'aimerais savoir si declare en fait définit une variable (à vider).

Réponse acceptée :

Cela dépend si la variable correspondante a déjà été déclarée dans la portée actuelle (niveau supérieur, c'est-à-dire fonction globale ou actuelle) auparavant.

Si elle n'a pas été déclarée dans la portée actuelle (et attention, dans la portée de niveau supérieur, la variable peut avoir déclarée (et affecté) en l'important depuis l'environnement), puis il le déclare (le rend local à la fonction lorsqu'il est dans la portée de la fonction), en lui affectant un type, mais ne l'initialise pas, même pas dans une liste vide (declare -p a affiche declare -a a , pas declare -a a=() comme si vous l'aviez déclaré et/ou assigné avec a=() ).

Si elle avait déjà été déclarée dans la portée actuelle (par exemple parce qu'elle a été importée en tant que variable scalaire depuis l'environnement lorsqu'elle était dans la portée globale), alors declare -a a essaierait de convertir dans un tableau.

Si c'était auparavant un scalaire, alors il devient un ([0]=value-of-the-variable) déployer. S'il s'agissait déjà d'un tableau, il n'est pas modifié. S'il s'agissait d'un tableau associatif, il échoue avec un cannot convert associative to indexed array erreur.

Notez que declare a ne convertirait pas un tableau ou un hachage en scalaire. bash ne serait pas en mesure de convertir un hachage/tableau en scalaire de toute façon. Vous pouvez utiliser declare +aA a pour forcer un scalaire (cela échouerait avec une erreur si la variable était auparavant un hachage/tableau dans la portée actuelle).

Dans votre cas, la variable n'était probablement pas déjà déclarée dans la portée actuelle, elle a donc été déclarée mais non affectée, ce qui explique pourquoi la tentative de développement échoue sous set -u .

Cette distinction entre deux déclarés et attribué /définir les états d'une variable ne sont pas spécifiques à bash . En POSIX sh , vous pouvez également export une variable ou rendez-la readonly sans lui donner de valeur.

$ sh -uc 'unset -v var; readonly var; : "$var"'
sh: 1: var: parameter not set

Notez que unset supprime et annule la déclaration de la variable. Dans bash , mksh et yash il peut restaurer la variable à partir d'une portée externe.

En relation :Pourquoi ls -l n'affiche-t-il pas l'heure et/ou l'année pour chaque fichier ?

En zsh , sauf en sh émulation, en utilisant typeset on a variable déclare et définit une valeur vide si elle n'était pas déjà définie ou si elle était définie mais d'un type différent (scalaire vs tableau vs tableau associatif).


Linux
  1. Comment créer un tableau d'éléments uniques à partir d'une chaîne/tableau dans Bash ?

  2. La commande Rm dans le script Bash ne fonctionne pas avec la variable ?

  3. Bash tableau de tableaux?

  4. Comment déclarer un tableau 2D dans bash

  5. Que fait 'bash -c' ?

Bash declare Statement :Syntaxe et exemples

Variable d'exportation bash

Comment créer des alias Bash

Tableaux bash

Tableau associatif dans Bash

Comment définir une variable d'environnement dans Bash