[*]
Bash declara comando embutido
Em sistemas operacionais do tipo Unix, declare é um comando embutido do shell Bash. Ele declara funções e variáveis de shell, define seus atributos e exibe seus valores.
Descrição
No bash, as variáveis podem ter um valor (como o número 3). Opcionalmente, as variáveis também podem ter atributos atribuídos (como inteiro).
Por exemplo, uma variável “somente leitura” (declara -r) não pode ser removida e seu valor e outros atributos não podem ser modificados. Uma variável de “matriz indexada” (declare -a) é uma matriz de valores indexados por número, começando em zero. Uma variável de “matriz associativa” (declara -A) é uma matriz de pares de valores-chave cujos valores são indexados por uma palavra-chave. (Para obter mais informações, consulte arrays no bash).
Além das variáveis, as funções bash podem receber atributos que afetam seu comportamento. Consulte as opções -f e -F abaixo para obter mais informações.
O comando typeset é um apelido para declare. Os dois podem ser usados alternadamente no bash.
Sintaxe
declare [-a] [-A] [-f] [-F] [-g] [-i] [-l] [-n] [-r] [-t] [-u] [-x] [-p] [name[=value]] [name[=value]] ...
Opções
O comando declare builtin assume as seguintes opções gerais:
Opção | Descrição |
---|---|
-f | Todos os nomes são tratados como nomes de funções, não variáveis. |
-F | Ao exibir informações sobre uma função, exiba apenas o nome e os atributos da função. Não exiba o conteúdo da função. |
-g | Quando declare é usado em uma função shell, a opção -g faz com que todas as operações nas variáveis tenham efeito no escopo global. Se não for usado em uma função shell, -g não terá efeito. |
-p | Quando usado com argumentos de nome, -p exibe as opções e atributos de cada nome de variável e -f ou -F são ignorados (as funções não são descritas).
Quando usado com opções, mas sem nomes, -p exibe os atributos e valores, que correspondem às outras opções especificadas, de todas as variáveis e funções. Quando usado sem opções ou nomes, -p exibe os atributos e valores de todas as variáveis e funções, ou apenas funções se -f for especificado. |
As opções restantes, listadas abaixo, fazem com que declare definir um atributo se a letra da opção for precedida por um travessão. Se precedido por um sinal de mais, declare cancelará a definição do atributo.
Opção | Não definido com | Descrição |
---|---|---|
-uma | Declare os itens nomeados como matrizes indexadas. Este atributo não pode ser cancelado. | |
-UMA | Declare os itens nomeados como matrizes associativas. Este atributo não pode ser cancelado. | |
-eu | + i | Dê aos itens nomeados o atributo inteiro. Os valores atribuídos à variável serão restritos a valores inteiros. Se um valor não inteiro for atribuído, um erro será relatado ou o valor 0 (zero) será atribuído.
Se o valor atribuído for uma string que representa uma operação aritmética em números inteiros (como “5 + 5”), o resultado da operação é atribuído. Se o resultado da operação não for um inteiro, o piso inteiro é atribuído (por exemplo, “22/7” atribui 3). Os valores de ponto flutuante não podem ser usados e, se forem, um erro será relatado. O Bash não oferece suporte a operações matemáticas de ponto flutuante. |
-eu | + l | Quando um valor é atribuído à variável nomeada, converta todas as letras maiúsculas em minúsculas. Se o atributo maiúsculo (-u) foi definido anteriormente para a variável, o atributo não é definido. |
-n | + n | Dê a cada nome o atributo nameref, tornando-o uma “referência de nome” para outra variável. A variável referenciada é definida pelo valor de nome. Todas as referências, atribuições e modificações de atributos de nome, exceto aquelas que usam ou alteram o atributo nameref, são realizadas na variável referenciada pelo valor de nome. Em outras palavras, torna a variável um ponteiro para outra variável.
O atributo nameref não pode ser aplicado a matrizes. |
-r | + r | Torne os itens nomeados somente leitura. Eles não podem ser atribuídos posteriormente a valores ou não configurados. |
-t | + t | Dê a cada item nomeado o atributo trace. Se o item for uma função, ele herdará as armadilhas DEBUG e RETURN do shell pai. Se o item for uma variável, o atributo trace não tem efeito. |
-você | + vc | Quando um valor é atribuído à variável nomeada, todas as letras minúsculas são convertidas em maiúsculas. Se o atributo minúsculo (-l) foi definido anteriormente para a variável, o atributo não é definido. |
-x | + x | Marque os itens nomeados para exportar para processos filho, como se o comando export embutido tivesse sido usado. |
Âmbito lexical
Quando declare é usado dentro de uma função shell, todos os itens nomeados são declarados em um escopo local, a menos que a opção -g seja usada. Esse comportamento é o mesmo que usar o comando interno local.
Status de saída
O status de saída de declarar é sucesso (zero), a menos que uma opção inválida seja especificada ou ocorra um erro, caso em que o status é falha (diferente de zero).
Exemplos
Declarando e listando variáveis
declare -p
Liste todas as variáveis declaradas, seus atributos e seus valores.
declare myvar
Declare uma variável, myvar, e não atribua nenhum valor a ela. Agora execute o primeiro comando novamente:
declare -p
Desta vez, observe na saída que myvar está listado após todas as outras variáveis como:
declare -- myvar
O traço duplo é equivalente a “sem opções”. Isso significa que myvar é declarado e não tem atributos. Se tivesse um valor atribuído, o valor seria listado aqui.
myvar=33
Atribua o valor 33 a myvar.
declare myvar=33
Igual ao comando acima.
declare -- myvar=33
Igual aos dois comandos acima.
declare -- myvar="33"
Igual aos três comandos acima; esta é a forma adequada, incluindo o valor entre aspas duplas. No entanto, qualquer um dos quatro comandos acima tem o mesmo efeito.
Agora, liste todas as variáveis novamente:
declare -p
Você verá que, desta vez, a saída lista myvar com sua atribuição de valor:
declare -- myvar="33"
O principal ponto a ser observado aqui é que, quando você executa declare -p, as variáveis são listadas como o comando declare completo e você precisa definir a variável com seus atributos e valor atuais.
Configurando e desconfigurando atributos
Os próximos comandos modificam os atributos da variável:
declare -x myvar
Declare que myvar deve ser exportado para qualquer processo shell filho. Isso é o equivalente a usar o comando export:
export myvar
Agora, liste as declarações de variáveis:
declare -p
Observe que na saída, o traço duplo (sem opções) foi substituído por -x:
declare -x myvar="33"
Para remover o atributo de exportação, use + x em vez disso:
declare +x myvar
Depois de executar o comando acima, myvar não será mais exportado para processos de subshell.
Inteiros e avaliação de inteiros
O Bash permite que você declare que uma variável tem o atributo inteiro, o que garante que a variável sempre contenha um valor inteiro. Também permite a avaliação aritmética ao atribuir um valor.
declare -i myvar
Declare que myvar deve ser tratado como um inteiro.
myvar="test"
A string “teste” é um valor não inteiro, então o valor 0 (zero) é atribuído em seu lugar. Você pode verificar isso se ecoar o valor:
echo $myvar
0
Qualquer valor inteiro positivo ou negativo pode ser atribuído, no entanto. (O valor máximo possível depende do seu computador, mas é enorme):
myvar=-33; echo $myvar
-33
Se uma string contendo uma operação aritmética for atribuída a uma variável inteira, o resultado da operação será atribuído. Por exemplo:
myvar="2*11"; echo $myvar
22
O comando acima atribui a myvar o valor de 2 vezes 11.
Se a operação matemática resultar em um número com uma vírgula decimal, o resultado será arredondado para o próximo inteiro mais baixo. Por exemplo:
myvar="33/5"; echo $myvar
6
O resultado preciso de 33 dividido por 5 (33/5) é 6,6, mas bash o arredonda para o inteiro 6.
Se você tentar usar valores decimais como operandos, bash retornará um erro, informando que o ponto decimal é um operador desconhecido:
myvar="33.1/5"; echo $myvar
bash: 33.1/5: syntax error: invalid arithmetic operator (error token is ".1/5")
Para remover o atributo inteiro, use a opção + i:
declare +i myvar
Agora, myvar não tem mais o atributo integer. Strings contendo operações matemáticas são atribuídas literalmente a myvar, ao invés de avaliadas. Por exemplo:
myvar="33.1/5"; echo $myvar
33.1/5
Matrizes indexadas
Para declarar uma matriz indexada, use -a:
declare -a myvar
Se myvar já tinha um valor atribuído, esse valor é indexado como o primeiro elemento, numerado como zero:
echo ${myvar[0]}
33.1/5
Agora você pode atribuir valores a elementos da matriz myvar usando números inteiros como índices:
myvar[1]="Hello"
myvar[2]="World!"
Os elementos podem ser acessados por número de índice usando a seguinte sintaxe:
echo ${myvar[2]}
World!
Se você usar um número inteiro negativo como índice, o bash conta a partir do último elemento, ao invés do primeiro. Para acessar o último elemento, use o índice -1:
echo ${myvar[-1]}
World!
Um índice de -2 acessaria o penúltimo elemento da matriz, etc .:
echo ${myvar[-2]}
Hello
Para exibir todos os elementos em uma matriz, você pode usar um asterisco (“*”) como o índice. Os elementos individuais são separados por um espaço:
echo ${myvar[*]}
33.1/5 Hello World!
Você não pode remover a definição do atributo array com + a. O Bash não tem procedimento para converter um array em outro tipo, então ele retorna um erro, mesmo se nenhum valor tiver sido atribuído. Por exemplo:
declare +a myvar
bash: declare: myvar: cannot destroy array variables in this way
Verifique se uma variável está declarada
Se você estiver escrevendo um script bash e precisar verificar se uma variável foi declarada, esta é a maneira correta de fazer isso:
if [ -z ${myvar+x} ]; then echo "not set"; else echo "set"; fi
Este script executa a expansão do parâmetro “Atribuir valor alternativo”, que testa se myvar foi definido e se seu valor é nulo. Se myvar não estiver definido, ele exibirá “não definido”. Caso contrário, ele ecoará “set”. Observe que a letra x pode ser qualquer coisa que você desejar, mas é necessária para que a comparação ocorra.
Comandos relacionados
exportar – Marque variáveis e funções a serem exportadas para processos filhos.
0 Comments