GNU/Linux >> Tutoriales Linux >  >> Linux

¿`Declare -a A` crea una matriz vacía `a` en Bash?

declare -a A crear una matriz vacía A en bash, o simplemente establece un atributo en el caso A se asigna a más tarde?

Considere este código:

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

¿Cuál debería ser el resultado esperado?

En Bash 4.3.48(1) obtengo bash: A: unbound variable al consultar el número de elementos después de declare .
También recibo ese error al acceder a todos los elementos.
Sé que las versiones posteriores de Bash tratan esto de manera diferente.
Aún así, me gustaría saber si declare en realidad define una variable (para estar vacía).

Respuesta aceptada:

Eso depende de si la variable correspondiente ya se ha declarado en el alcance actual (función actual o global de nivel superior) antes.

Si no se ha declarado en el ámbito actual (y tenga en cuenta que en el ámbito de nivel superior, la variable puede haber declarado (y asignado) importándolo desde el entorno), luego lo declara (lo hace local a la función cuando está en el alcance de la función), asignándole un tipo, pero no lo inicializa, ni siquiera a una lista vacía (declare -p a muestra declare -a a , no declare -a a=() como lo haría si lo hubiera declarado y/o asignado con a=() ).

Si ya se había declarado en el ámbito actual (por ejemplo, porque se importó como una variable escalar del entorno cuando estaba en el ámbito global), entonces declare -a a intentaría convertir en una matriz.

Si antes era un escalar, entonces se convierte en ([0]=value-of-the-variable) formación. Si ya era una matriz, se deja intacta. Si era una matriz asociativa, falla con un cannot convert associative to indexed array error.

Tenga en cuenta que declare a no convertiría una matriz o un hash en escalar. bash no sería capaz de convertir un hash/matriz a escalar de todos modos. Puedes usar declare +aA a para forzar un escalar (que fallaría con un error si la variable era previamente un hash/matriz en el ámbito actual).

En su caso, la variable probablemente aún no se declaró en el alcance actual, por lo que terminó declarada pero no asignada, lo que explica por qué falla al intentar expandirla en set -u .

Esa distinción entre dos declarada y asignado /establecer los estados de una variable no son específicos de bash . En POSIX sh , también puede export una variable o convertirla en readonly sin darle un valor.

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

Tenga en cuenta que unset tanto anula como anula la declaración de la variable. En bash , mksh y yash puede restaurar la variable desde un ámbito externo.

Relacionado:¿Por qué ls -l no muestra la hora o el año de cada archivo?

En zsh , excepto en sh emulación, usando typeset en una variable lo declara y lo establece en un valor vacío si aún no estaba configurado o si lo estaba pero de un tipo diferente (escalar vs matriz vs matriz asociativa).


Linux
  1. Bash Dynamic (variable) ¿Nombres de variables?

  2. ¿Cómo crear una matriz de elementos únicos a partir de una cadena/matriz en Bash?

  3. ¿El comando Rm en Bash Script no funciona con variables?

  4. Bash Matriz de matrices?

  5. Alias ​​con variable en bash

Declaración Bash declare:sintaxis y ejemplos

Variable de exportación de bash

Cómo crear alias de Bash

Arreglos bash

Matriz asociativa en Bash

Cómo establecer la variable de entorno en Bash