-a- para hacer matrices indexadas de NOMBRES (si es compatible)

-a- para hacer matrices indexadas de NOMBRES (si es compatible)

Mi objetivo es comprender el concepto general de "atributos variables" con la esperanza de que me ayude a comprender¿Qué se declara en Bash?.

¿Qué es un atributo variable? ¿Por qué alguien querría darle un atributo a una variable? ¿Por qué no es "suficiente" simplemente crear variables y expandirlas en ejecución cuando se trabaja con variables?

Respuesta1

Normalmente, una variable es un lugar para almacenar un valor. Usted asigna un valor a la variable ( var="some value"), y luego puede recuperar el valor con una expansión de variable (escribir "$var"es equivalente a escribir "some value").

Es posible crear variables que hagan algo especial cuando les asignas un valor, o en otras circunstancias en las que el shell accede a las variables. Un atributo de una variable es una anotación que el shell almacena junto al nombre y valor de la variable, lo que le indica al shell que aplique este comportamiento especial.

Un ejemplo

declare -i xle dice al shell que xdebe contener solo valores enteros. Normalmente, cuando asigna un valor a una variable, el shell toma la cadena que resulta de expandir el lado derecho del signo igual y la almacena como el valor de la variable. Pero si la variable tiene el atributo de número entero, el shell analiza esa cadena como una expresión aritmética y almacena el resultado de evaluar esa expresión. Por ejemplo:

$ x=2+2; echo $x
2+2
$ declare -i x; x=2+2; echo $x
4
$ declare -i x; x=2+hello; echo $x
2
$ declare -i x; x=2+
bash: 2+: syntax error: operand expected (error token is "+")

(La tercera línea x=2+hellose establece xen 2 porque helloes un nombre de variable que no está definido, y las variables no configuradas se interpretan silenciosamente como 0 de forma predeterminada).

Más ejemplos

  • declare -l vardeclara que vardebe contener únicamente letras minúsculas. Cuando el shell almacena el valor de la variable, convierte cualquier letra mayúscula a minúscula.
  • declare -u varhace la conversión en la otra dirección.
  • declare -r varhace que sea varde solo lectura, que también es un comportamiento especial de la asignación: hace que todas las asignaciones posteriores varfallen.
  • declare -x varcausa varque se exporte al medio ambiente. Para este atributo, el comportamiento especial ocurre cuando bash ejecuta un comando externo: los comandos externos ven un entorno que contiene las variables que el shell está exportando en el momento en que el shell ejecuta el comando externo.

Respuesta2

De help declare:

Options which set attributes:
    -a  to make NAMEs indexed arrays (if supported)
    -A  to make NAMEs associative arrays (if supported)
    -i  to make NAMEs have the `integer' attribute
    -l  to convert the value of each NAME to lower case on assignment
    -n  make NAME a reference to the variable named by its value
    -r  to make NAMEs readonly
    -t  to make NAMEs have the `trace' attribute
    -u  to convert the value of each NAME to upper case on assignment
    -x  to make NAMEs export

Nota: declaretambién se puede utilizar para funciones.

Cada uno de estos atributos tiene uno o varios usos:


-a- para hacer matrices indexadas de NOMBRES (si es compatible)

Esto no es del todo necesario porque establecer un parámetro como una matriz lo declarará automáticamente como una matriz indexada. Usar esto podría hacer que su código sea más obvio y legible.


-A- para hacer matrices asociativas de NOMBRES (si es compatible)

AFAIK, esto es completamente necesario ya que intentar establecer una matriz asociativa sin declararla primero como tal dará como resultado una matriz indexada.

$ assoc=([foo]=bar)
$ declare -p assoc
declare -a assoc=([0]="bar")
$ unset assoc
$ declare -A assoc
$ assoc=([foo]=bar)
$ declare -p assoc
declare -A assoc=([foo]="bar" )

-i- hacer que los NOMBRES tengan el atributo "entero"

Útil si desea asegurarse de que su parámetro puedasolomantener números enteros. Esto también le permite realizar expansión aritmética en la asignación.

$ declare -i a
$ a=foo
$ echo $a
0
$ a=1+1
$ echo $a
2

-l- para convertir el valor de cada NOMBRE a minúsculas en la asignación

Se asegurará de que el valor de sus parámetros siempre esté en minúsculas. Esta es una característica bastante interesante que no conocía y que probablemente usaré en el futuro. Elimina la necesidad de una expansión de parámetros compleja o el uso de una utilidad separada comotr

$ declare -l foo=Bar
$ echo $foo
bar

-n- hacer que NOMBRE sea una referencia a la variable nombrada por su valor

Como una referencia indirecta. Esto podría eliminar el uso de evalen muchos scripts.

$ a=foo
$ declare -n b=a
$ echo $b
foo

-r- para hacer que los NOMBRES sean de solo lectura

Esta es una buena característica. Podría ser especialmente útil para variables ambientales/de shell que desea configurar una vez y asegurarse de que no se modifiquen.

$ declare -r foo=bar
$ echo $foo
bar
$ foo=baz
-bash: foo: readonly variable

-t- hacer que los NOMBRES tengan el atributo "trace"

No estoy seguro de este. Creo que puede que solo se aplique a funciones.


-u- para convertir el valor de cada NOMBRE a mayúsculas en la asignación

Similar -lpero opuesto

$ declare -u foo=bAr
$ echo $foo
BAR

-x- para exportar NOMBRES

Otra forma más de exportar variables al entorno.


información relacionada