En las secuencias de comandos bash, ¿cuál ' es la diferencia entre declare y una variable normal?

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

  • Cuando se usa en una función, declare hace que los NAME sean locales, como con el comando local. La opción -g suprime este comportamiento. Consulte help declare.
  • declare hace posible la creación de matrices asociativas, enteros y lecturas solo variables. Además, expande sus argumentos, por lo que cosas como declare $name=1 son posibles.

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 comando local. 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 y declare es más compatible con otras shells?
  • @ 0xc0de export existe en todas las variantes de sh. local solo existe en bash y zsh, declare solo en bash. typeset existe en ksh, bash y zsh.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *