No script bash, qual é a diferença entre declarar e uma variável normal?

27

No bash scripting:

nós criamos variáveis apenas nomeá-lo:

abc=ok

ou podemos usar declarar

declare abc=ok

qual é o diferente?

e por que o bash faz tantas maneiras de criar variáveis?

    
por lovespring 10.01.2016 / 09:19

2 respostas

24

De help -m declare :

NAME

    declare - Set variable values and attributes.

SYNOPSIS

    declare [-aAfFgilnrtux] [-p] [name[=value] ...]

DESCRIPTION

    Set variable values and attributes.

    Declare variables and give them attributes. If no NAMEs are given, display the attributes and values of all variables.

    Options:

      -f
        restrict action or display to function names and definitions
      -F
        restrict display to function names only (plus line number and source file when debugging)
      -g
        create global variables when used in a shell function; otherwise ignored
      -p
        display the attributes and value of each NAME

    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 NAMEs 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 NAMEs to upper case on assignment
      -x
        to make NAMEs export

    Using ‘+’ instead of ‘-’ turns off the given attribute.

    Variables with the integer attribute have arithmetic evaluation (see the let command) performed when the variable is assigned a value.

    When used in a function, declare makes NAMEs local, as with the local command. The ‘-g’ option suppresses this behavior.

    Exit Status:
    Returns success unless an invalid option is supplied or a variable assignment error occurs.

SEE ALSO

    bash(1)

IMPLEMENTATION

    GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
    Copyright (C) 2013 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http&colon;//gnu.org/licenses/gpl.html>

Portanto, declare é usado para definir valores de variáveis e atributos .

Deixe-me mostrar o uso de dois atributos com um exemplo muito simples:

$ # 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

No exemplo acima, acho que você deve entender o uso da variável declare sobre a variável normal! Esse tipo de declare ção é útil em funções, loops com scripts.

Visite também as Variáveis de digitação: declarar ou compor

    
por 10.01.2016 / 11:17
9

abc=ok atribui um valor à variável abc . declare abc declara uma variável chamada abc . Os dois podem ser combinados como declare abc=ok .

No bash, como outros shells, as variáveis string e array não precisam ser declaradas, portanto, declare não é necessário, a menos que você queira passar opções, por exemplo, declare -A abc para tornar abc uma matriz associativa ou declare -r para tornar uma variável somente leitura. No entanto, dentro de uma função, declare faz diferença: faz com que a variável seja local para a função, o que significa que o valor da variável fora da função (se houver) é preservado. (A menos que você use declare -g , o que torna a variável não local; isso é útil quando combinado com outras opções, por exemplo, declare -gA para criar um array associativo global em uma função.) Exemplo:

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"

Saída:

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

Outra coisa que você pode fazer com o declare builtin é

O declare builtin é exclusivo para o bash. Ele é strongmente inspirado e muito próximo do typeset builtin do ksh, e o bash fornece typeset como sinônimo de declare para compatibilidade. (Eu não sei porque o bash não apenas chamou typeset ). Há um terceiro sinônimo, local . Há também export , que é o mesmo que declare -x , novamente para compatibilidade (com cada shell estilo Bourne).

    
por 11.01.2016 / 02:21