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.