
¿ declare -a A
Crea una matriz vacía A
en bash o simplemente establece un atributo en caso de que A
se 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 variable
al 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 declare
realmentedefineuna 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 a
muestra 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 a
intentarí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 array
error.
Tenga en cuenta que declare a
no convertiría una matriz o un hash a escalar. bash
De todos modos, no podría convertir un hash/matriz a escalar. Puede usarlo declare +aA a
para 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 export
crear una variable o crearla 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 desarma como anula la declaración de la variable. En bash
y mksh
puede yash
restaurar la variable desde un ámbito externo.
En zsh
, excepto en sh
la emulación, el uso typeset
de 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).