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

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

¿ declare -a ACrea una matriz vacía Aen bash o simplemente establece un atributo en caso de que Ase asigne más adelante?

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 variableal consultar el número de elementos después de declare. También me sale 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 declarerealmentedefineuna variable (que esté vacía).

Respuesta1

Eso depende de si la variable correspondiente ya ha sido declarada en el alcance actual (nivel superior, también conocido como función global o actual) antes.

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

Si ya se hubiera declarado en el alcance actual (por ejemplo, porque se importó como una variable escalar del entorno cuando estaba en el alcance global), entonces declare -a aintentaríaconvertira una matriz.

Si antes era un escalar, entonces se convierte en una ([0]=value-of-the-variable)matriz. Si ya era una matriz, no se modifica. Si se trataba de una matriz asociativa, falla con un cannot convert associative to indexed arrayerror.

Tenga en cuenta que declare ano convertiría una matriz o un hash a escalar. bashDe todos modos, no podría convertir un hash/matriz a escalar. Puede usarlo declare +aA apara forzar un escalar (eso fallaría con un error si la variable era previamente un hash/matriz en el alcance actual).

En su caso, la variable probablemente aún no estaba declarada 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 dosdeclaradoyasignado/colocarLos estados de una variable no son específicos de bash. En POSIX sh, también puedes exportcrear una variable o crearla readonlysin darle un valor.

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

Tenga en cuenta que unsettanto desarma como anula la declaración de la variable. En bashy mkshpuede yashrestaurar la variable desde un ámbito externo.

En zsh, excepto en shla emulación, el uso typesetde una variable la declara y la establece en un valor vacío si aún no estaba configurada o si se configuró pero es de un tipo diferente (escalar, matriz o matriz asociativa).

información relacionada