O que unset faz?

0

Estou tentando entender a seguinte parte sobre unset do link

unset in bash only unsets a variable if it has been declared in the current scope (leaves it declared though except in the global scope; it removes attributes and values and the variable is no longer array or hash; also note that on namerefs, it unsets the referenced variable). Otherwise, it just pops one variable layer from the stack mentioned above.

O manual do Bash não menciona nada relacionado ou sinto falta dele.

Você poderia explicar com exemplos para

  • "apenas desmarca uma variável se foi declarada no escopo atual"
  • "deixa declarado embora exceto no escopo global".

    Se unset uma variável que está no escopo local de uma função, a variável unset não está apenas não definida, mas também não declarada?

    Se unset uma variável que está no escopo global, a variável unset não está definida, mas ainda está declarada?

    Como posso verificar se uma variável está declarada ou não?

  • "Caso contrário, apenas aparece uma camada variável da pilha mencionada acima."

    O que "caso contrário" e "uma camada variável" significam?

Obrigado.

    
por Tim 28.07.2017 / 16:38

1 resposta

2

Melhor com exemplos:

$ bash -c 'a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"'
declare -- a
0

Isso é unset chamado em uma variável declarada no mesmo escopo. Está completamente desfeito. Ainda é declarado (embora tenha perdido atributos e valor), ainda é limitado a esse escopo. Você vê que, embora façamos um a=2 , isso ainda é feito em um a local para f , aquele do escopo externo não é afetado. Isso é bom e o que queremos.

Em:

$ ./bash -c 'a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"'
0
2

Você pode ver que unset a não desatou a . Em vez disso, revelou o que está embaixo, aquele do escopo externo. Quando g retornar, a variável f a não será mais local.

Note que é ainda pior em mksh e yash , em que unset faz isso popping em vez de cancelar a definição mesmo para variáveis que foram declaradas no mesmo escopo. O primeiro exemplo com eles dá:

typeset a=0
2

Mais leituras em:

por 29.07.2017 / 01:25

Tags