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

No script bash:

criamos a variável apenas nomeando-a:

abc=ok 

ou podemos usar declare

declare abc=ok 

qual é a diferença?

e por que o bash oferece tantas maneiras de criar uma variável?

Comentários

  • Quando usado em uma função, declare torna NAMEs locais, como com o comando local. A opção -g suprime esse comportamento. Veja help declare.
  • declare torna possível criar matrizes associativas, inteiros e leitura apenas variáveis. Além disso, expande seus argumentos, então coisas como declare $name=1 são possíveis.

Resposta

De help -m declare:

NOME

    declare – Defina valores e atributos de variáveis.

SINOPSE

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

DESCRIÇÃO

    Definir valores e atributos de variáveis.

    Declarar variáveis e dar-lhes atributos. Se nenhum NOME for fornecido, exiba os atributos e valores de todas as variáveis.

    Opções:

      -f

        ação restrita ou exibição a nomes e definições de função

      -F

        restringir a exibição apenas aos nomes das funções (mais o número da linha e o arquivo de origem ao depurar)

      -g

        cria variáveis globais quando usado em uma função shell; caso contrário, ignorado

      -p

        exibir os atributos e valor de cada NOME

    Opções que definem atributos:

      -a

        para criar matrizes indexadas por NAMEs (se compatível)

      -A

        para criar matrizes associativas de NAMEs (se compatível)

      -i

        para fazer com que os NOMEs tenham o atributo integer

      -l

        para converter NAMEs em minúsculas na atribuição

      -n

        faça de NAME uma referência à variável nomeada por seu valor

      -r

        para tornar NAMEs re adonly

      -t

        para fazer NAMEs terem o trace attribute

      -u

        para converter NAMEs para letras maiúsculas na atribuição

      -x

        para fazer NOMEs exportar

    Usando + em vez de - desativa o atributo fornecido .

    Variáveis com o atributo inteiro têm avaliação aritmética (veja o comando let) realizada quando é atribuído um valor à variável.

    Quando usado em uma função, declare torna os NAMEs locais, como com o comando local. A opção -g suprime esse comportamento.

    Status de saída:
    Retorna sucesso, a menos que uma opção inválida seja fornecida ou um erro de atribuição de variável ocorra.

VEJA TAMBÉM

    bash (1)

IMPLEMENTAÇÃO

    GNU bash, versão 4.3.11 (1) -release (i686-pc-linux-gnu)
    Copyright (C) 2013 Free Software Foundation, Inc.
    Licença GPLv3 +: GNU GPL versão 3 ou posterior < http : //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 

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

Visite também Variáveis de digitação: declare ou composição

Comentários

  • sim, o " e atributos " é o ponto! essa é a diferença.
  • Ótimo! Adoro exemplos, melhor forma de ensinar / aprender. Obrigado!
  • Você precisa saber quais " atributos " são para entender esta resposta. Eles ' re propriedades da variável como ' integer ', ' array ' ou ' somente leitura '.
  • Isso faz um bom trabalho ao explicar a declaração, mas ignora completamente o que acontece quando você simplesmente declara uma variável por meio do bash.

Resposta

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 de string e array não precisam ser declaradas, então 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 a 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, que torna a variável não local; isso é útil quando combinado com outras opções, por exemplo, declare -gA para criar uma matriz associativa 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" 

Resultado:

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 

Outro algo que você pode fazer com o declare integrado é

O declare integrado é exclusivo do bash. É fortemente inspirado e muito próximo de ksh “s typeset integrado, e bash fornece typeset como sinônimo de declare para compatibilidade. (Não sei por que o bash simplesmente não o chamou de typeset). Existe “um terceiro sinônimo, local. Também existe export, que é o mesmo que declare -x, novamente para compatibilidade (com cada shell de estilo Bourne).

Comentários

  • sim! o ' e a opção ' são o ponto. p.s. se eu projetar o bash, deixarei o comportamento de " declarar " fazer algo em condições diferentes. isso simplifica as coisas.
  • Boa resposta. Outra questão, qual entre export, local e declare é o mais compatível com outros shells?
  • @ 0xc0de export existe em todas as variantes de sh. local existe apenas em bash e zsh, declare apenas em bash. typeset existe em ksh, bash e zsh.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *