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