En bash scripting:
creamos la variable simplemente nombrándola:
abc=ok
o podemos usar declare
declare abc=ok
¿cuál es la diferencia?
¿y por qué bash crea tantas formas de crear una variable?
Comentarios
Responder
De help -m declare
:
NOMBRE
declare
– Establecer valores y atributos de variables.SINOPSIS
declare
[-aAfFgilnrtux
] [-p
] [name
[=value
] …]DESCRIPCIÓN
Establecer valores y atributos de variables.
Declarar variables y darles atributos. Si no se proporcionan NAME, muestre los atributos y valores de todas las variables.
Opciones:
-f
restringir la acción o visualización a los nombres y definiciones de funciones
-F
restringir la visualización solo a los nombres de las funciones (más el número de línea y el archivo fuente al depurar)
-g
crea variables globales cuando se usa en una función de shell; de lo contrario se ignora
-p
muestra los atributos y el valor de cada NOMBRE
Opciones que establecen atributos:
-a
para crear matrices indexadas de NAME (si se admiten)
-A
para hacer matrices asociativas de NAME (si se admiten)
-i
para hacer que los NAME tengan el atributo «integer»
-l
para convertir NAME a minúsculas en la asignación
-n
hacer NAME una referencia a la variable nombrada por su valor
-r
para hacer que los NAME sean adonly
-t
para hacer que los NAME tengan el trace atributo
-u
para convertir NAME a mayúsculas en la asignación
-x
para hacer NAME exportar
Usando
+
en lugar de-
desactiva el atributo dado .Las variables con el atributo integer tienen una evaluación aritmética (ver el comando
let
) que se realiza cuando se asigna un valor a la variable.Cuando usado en una función,
declare
hace que los NAME sean locales, como con el comandolocal
. La opción-g
suprime este comportamiento.Estado de salida:
Devuelve correctamente a menos que se proporcione una opción no válida o se produzca un error de asignación de variable.VEA TAMBIÉN
bash (1)
IMPLEMENTACIÓN
GNU bash, versión 4.3.11 (1) -release (i686-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
Licencia GPLv3 +: GNU GPL versión 3 o posterior < http : //gnu.org/licenses/gpl.html >
Entonces, declare
se utiliza para establecer valores de variable y atributos .
Permítanme mostrar el uso de dos atributos con un ejemplo muy simple:
$ # First Example: $ declare -r abc=ok $ echo $abc ok $ abc=not-ok bash: abc: readonly variable $ # Second Example: $ declare -i x=10 $ echo $x 10 $ x=ok $ echo $x 0 $ x=15 $ echo $x 15 $ x=15+5 $ echo $x 20
Del ejemplo anterior, creo que debería comprender el uso de declare
variable sobre la variable normal. Este tipo de declare
ación es útil en funciones, bucles con secuencias de comandos.
Visite también Variables de escritura: declare o composición tipográfica
Comentarios
- sí, el " y atributos " es el punto! esta es la diferencia.
- ¡Genial! Amo los ejemplos, la mejor manera de enseñar / aprender. ¡Gracias!
- Necesita saber qué " atributos " son para comprender esta respuesta. Ellos ' son propiedades de la variable como ' integer ', ' matriz ', o ' de solo lectura '.
- Esto hace un buen trabajo al explicar declare, pero ignora por completo lo que sucede cuando simplemente declaras una variable a través de bash.
Responder
abc=ok
asigna un valor a la variable abc
. declare abc
declara una variable llamada abc
. Los dos se pueden combinar como declare abc=ok
.
En bash, al igual que otros shells, las variables de cadena y matriz no necesitan ser declaradas, por lo que declare
no es «necesario a menos que desee pasar opciones, p. Ej. declare -A abc
para hacer abc
una matriz asociativa o declare -r
para hacer una variable de solo lectura. Sin embargo, dentro de una función, declare
hace una diferencia: hace que la variable sea local a la función, lo que significa que el valor de la variable fuera de la función (si existe) se conserva . (A menos que use declare -g
, que hace que la variable no sea local; esto es útil cuando se combina con otras opciones, p. Ej. declare -gA
para crear un matriz asociativa en una función.) Ejemplo:
f () { declare a a="a in f" b="b in f" echo "From f: a is $a" echo "From f: b is $b" } a="Initial a" b="Initial b" f echo "After f: a is $a" echo "After f: b is $b"
Salida:
From f: a is a in f From f: b is b in f After f: a is Initial a After f: b is b in f
Otro Lo que puede hacer con el declare
incorporado es
El declare
incorporado es exclusivo de bash. Está fuertemente inspirado y muy cerca de ksh «s typeset
incorporado, y bash proporciona typeset
como sinónimo de declare
para compatibilidad. (No sé por qué bash no lo llamó simplemente typeset
). Hay un tercer sinónimo, local
. También hay export
, que es lo mismo que declare -x
, nuevamente por compatibilidad (con cada shell de estilo Bourne).
Comentarios
- ¡sí! la ' y la opción ' es el punto. PD. si diseño el bash, dejaré que el comportamiento de " declare " haga algo en una condición diferente. esto simplifica las cosas.
- Buena respuesta. Otra pregunta: ¿cuál de
export
,local
ydeclare
es más compatible con otras shells? - @ 0xc0de
export
existe en todas las variantes desh
.local
solo existe en bash y zsh,declare
solo en bash.typeset
existe en ksh, bash y zsh.
declare
hace que los NAME sean locales, como con el comandolocal
. La opción-g
suprime este comportamiento. Consultehelp declare
.declare
hace posible la creación de matrices asociativas, enteros y lecturas solo variables. Además, expande sus argumentos, por lo que cosas comodeclare $name=1
son posibles.