Variáveis globais são aquelas que podem ser vistas por qualquer função, e/ou por qualquer parte do script.
Variáveis locais são usadas somente dentro de uma função e tem precedência sobre as variáveis globais, isso quer dizer que se declararmos VAR globalmente, e depois declararmos VAR localmente, o shell usará a variável local, lembre-se disso.
Constante, como o próprio nome diz, é uma constante, ela não pode ter seu valor alterado de nenhuma forma no decorrer da execução do script.
Para criarmos uma variável global basta declararmos normalmente a variável, exemplo:
TRUE='0'
FALSE='1'
Com isso as duas variáveis acima podem ser vistas em qualquer lugar do código.
Para criamos uma variável local devemos primeiro declará-las dentro de uma função, e antes do nome da variável devemos usar a palavra local, exemplo:
function minha_funcao(){
local TRUE='verdade'
local FALSE='falso'
echo $TRUE
echo $FALSE
}
Vamos ver o funcionamento da precedência:
$ TRUE='0'
$ FALSE='1'
$ function minha_funcao(){ local TRUE='verdade'; local FALSE='falso'; echo $TRUE; echo $FALSE; }
$ echo $TRUE
0
$ echo $FALSE
1
$ minha_funcao
verdade
falso
O uso de variáveis locais é muito importante, pois assim facilita a reutilização do código, além de ajudar na criação de uma biblioteca de funções, pois usando variáveis locais você evitará o conflito entre variáveis, então é altamente recomendado que sempre que for criar uma variável dentro de uma função que ela seja local, evite o máximo possível o uso de variáveis globais.
Vamos agora ver um pouco sobre as constantes. As constantes podem estar em qualquer parte do código, porém assim como as variáveis globais é preferível que elas sejam declaradas no começo do código, isso se aplica as funções, ou seja, se precisar de uma constante coloque-a no começo da função e de preferência sendo uma constante local.
Para se declarar uma constante devemos fazer:
declare -r <nome_da_constante>=<valor>
Exemplo:
declare -r CONSTANTE='sempre igual'
O comando declare é uma função interna do bash, há outras opções, mas novamente prefiro não entrar em detalhes. No nosso caso a opção '-r', diz que a variável é somente leitura (readonly). Vamos ver o que ocorre se tentamos mudar ou deletar uma constante:
$ declare -r CONSTANTE='sempre igual'
$ CONSTANTE='mude'
bash: CONSTANTE: readonly variable
$ unset CONSTANTE
bash: unset: CONSTANTE: cannot unset: readonly variable
Para declararmos uma constante local fazemos:
function minha_funcao(){
local -r TRUE='verdade'
local -r FALSE='falso'
echo $TRUE
echo $FALSE
TRUE='nem vem'
FALSE='isso ai cara'
}
A execução resultante é:
$ minha_funcao
verdade
falso
bash: TRUE: readonly variable