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:
-frestringir la acción o visualización a los nombres y definiciones de funciones
-Frestringir la visualización solo a los nombres de las funciones (más el número de línea y el archivo fuente al depurar)
-gcrea variables globales cuando se usa en una función de shell; de lo contrario se ignora
-pmuestra los atributos y el valor de cada NOMBRE
Opciones que establecen atributos:
-apara crear matrices indexadas de NAME (si se admiten)
-Apara hacer matrices asociativas de NAME (si se admiten)
-ipara hacer que los NAME tengan el atributo «integer»
-lpara convertir NAME a minúsculas en la asignación
-nhacer NAME una referencia a la variable nombrada por su valor
-rpara hacer que los NAME sean adonly
-tpara hacer que los NAME tengan el trace atributo
-upara convertir NAME a mayúsculas en la asignación
-xpara 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,
declarehace que los NAME sean locales, como con el comandolocal. La opción-gsuprime 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,localydeclarees más compatible con otras shells? - @ 0xc0de
exportexiste en todas las variantes desh.localsolo existe en bash y zsh,declaresolo en bash.typesetexiste en ksh, bash y zsh.
declarehace que los NAME sean locales, como con el comandolocal. La opción-gsuprime este comportamiento. Consultehelp declare.declarehace posible la creación de matrices asociativas, enteros y lecturas solo variables. Además, expande sus argumentos, por lo que cosas comodeclare $name=1son posibles.