Atribuição de variável global e local

3

Estou aprendendo scripts de shell através de alguns tutoriais online e cheguei ao seguinte script que declara diferenças de variáveis globais e locais.

#!/bin/bash
# Experimenting with variable scope
var_change () {
  local var1='local 1'
  echo Inside function: var1 is $var1 : var2 is $var2
  var1='changed again'
  var2='changed again'
}

var1='global 1'
var2='global 2'

echo Before function call: var1 is $var1 : var2 is $var2

var_change

echo After function call: var1 is $var1 : var2 is $var2

E a saída é:

Before function call: var1 is global 1 : var2 is global 2

Inside function: var1 is local 1 : var2 is global 2

After function call: var1 is global 1 : var2 is changed again

Minha pergunta ...

Por que var1 após a chamada da função "global 1" é substituída por "changed again"? Alguém pode explicar?

    
por Jeff Pang 23.09.2017 / 04:35

2 respostas

3

var1 é declarado local na função. Então, durante a execução da função, existem duas variáveis denominadas var1 : a global e a local; mas a função só pode "ver" a local (a local "escurece" a global). Então, dentro da função, qualquer coisa que você fizer para var1 é feita para a variável local; o global var1 não é tocado de todo.

    
por 23.09.2017 / 04:49
1

Uma maneira de pensar nisso é imaginar que local var1="local 1" tem o efeito de salvar o valor atual de var1 , com a promessa de que, no final da função, ela será restaurada e, em seguida, configurada como %código%. Com esse modelo mental, você pode pensar em todas as variáveis como globais e as variáveis sendo restauradas no final das funções.

O exemplo teria sido melhor se em vez de chamar echo dentro da função e fora dela tivesse chamado outra função que tivesse gerado "local 1" .

bash$ show(){ printf "   The value of %s in %s is '%s'\n" $1 $2 ${!1} ; }
bash$ bar(){ show v1 bar_$1 ; }
bash$ foo(){ show v1 before_foo ; local v1 ; show v1 after_local ; \ 
               v1="changed"; show v1 after_change ; bar via_foo ; }
bash$ v1="global"
bash$ show v1 global_scope
   The value of v1 in global_scope is 'global'
bash$ foo
   The value of v1 in before_foo is 'global'
   The value of v1 in after_local is ''
   The value of v1 in after_change is 'changed'
   The value of v1 in bar_via_foo is 'changed'
bash$ bar direct
   The value of v1 in bar_direct is 'global'
bash$ show v1 global_scope
   The value of v1 in global_scope is 'global'

Aqui você pode ver na chamada para barra de dentro foo pega o valor de v1 que foi estabelecido por foo.

Uma pesquisa na Web para var vs dynamic scope pode ajudar.

    
por 23.09.2017 / 04:49