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
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 comandolocal
. 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
edeclare
é o mais compatível com outros shells? - @ 0xc0de
export
existe em todas as variantes desh
.local
existe apenas em bash e zsh,declare
apenas em bash.typeset
existe em ksh, bash e zsh.
declare
torna NAMEs locais, como com o comandolocal
. A opção-g
suprime esse comportamento. Vejahelp declare
.declare
torna possível criar matrizes associativas, inteiros e leitura apenas variáveis. Além disso, expande seus argumentos, então coisas comodeclare $name=1
são possíveis.