Li o que está listado na Bibliografia sobre , unset
e "Funções Shell".declare
local
Minha versão do Bash é
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
var='outer'
declare -p var
unset var
declare -p var
function foo {
echo \""I'm in"\"
local var='inner'
declare -p var
unset var
declare -p var
}
foo
(a citação estranha I'm in
está lá apenas para preservar o destaque da sintaxe no bloco de citação a seguir.) Isso imprime
declare -- var="outer"
bash: declare: var: not found
"I'm in"
declare -- var="inner"
declare -- var
Há uma diferença em desconfigurar uma variável global e desconfigurar uma variável local dentro de uma função. No primeiro caso, a variável é removida. No último, a variável permanece declarada (mas desconfigurada).
Existe uma maneira de remover completamente uma variável local dentro de uma função (antes que a função retorne)? Ou seja, a saída seria
declare -- var="outer"
bash: declare: var: not found
"I'm in"
declare -- var="inner"
bash: declare: var: not found
Isso seria útil para testar se uma variável não existe dentro de uma função, como em
function foo {
local var
while
declare -p var
do
echo "$var"
((var++))
[[ "$var" -eq 4 ]] \
&& unset var
done
}
Este código é executado em loop indefinidamente, imprimindo
declare -- var="1"
1
declare -- var="2"
2
declare -- var="3"
3
declare -- var
declare -- var="1"
1
declare -- var="2"
2
declare -- var="3"
3
declare -- var
[omissis]
Há algo errado em verificar se uma variável existe usando declare -p
?
A única menção que encontrei no manual de referência do Bash sobre a diferença entre desconfigurar uma variável global e uma local é
Se uma variável no escopo local atual não estiver definida, ela permanecerá assim (aparecendo como não definida) até ser redefinida naquele escopo ou até que a função retorne. (ref. Manual de referência do Bash - seção "Funções do Shell")
onde a palavra que aparece é a única pista.
Bibliografia
- Manual de referência do Bash , seção "4 comandos internos do Shell"
- O que o unset faz?
Uma variável local não pode ser desfeita na função em que foi declarada. No entanto, ela pode ser desfeita em uma função chamada a partir dessa função.
Observe também que o Bash 5 adicionou uma nova opção de shell
localvar_unset
: