Existe alguma vantagem / desvantagem em inicializar o valor de uma variável bash no script, antes do código principal ou de variáveis locais em uma função antes de atribuir o valor real a ele?
Preciso fazer algo assim:
init()
{
name=""
name=$1
}
init "Mark"
Existe algum risco de as variáveis serem inicializadas com valores de lixo (se não inicializadas) e de terem um efeito negativo nos valores das variáveis?
name = ""; name = argv[1];
? E isso não é tão inútil?Respostas:
Não há benefício em atribuir uma sequência vazia a uma variável e, em seguida, atribuir imediatamente outra sequência variável a ela. Uma atribuição de um valor a uma variável do shell substituirá completamente seu valor anterior.
No meu conhecimento, nenhuma recomendação diz que você deve inicializar explicitamente variáveis para cadeias vazias. De fato, fazer isso pode mascarar erros em algumas circunstâncias (erros que de outra forma seriam aparentes se executados em baixo
set -u
, veja abaixo).Uma variável não configurada, que não está sendo usada desde o início de um script ou que não foi definida explicitamente executando o
unset
comando nele, não terá valor. O valor dessa variável não será nada. Se usado como"$myvariable"
, você obterá o equivalente a""
e nunca obterá "dados de lixo".Se a opção shell
nounset
estiver configurada com umset -o nounset
ouset -u
, a referência a uma variável não configurada fará com que o shell produza um erro (e um shell não interativo seria encerrado):ou, em
bash
:As variáveis do shell serão inicializadas pelo ambiente se o nome da variável corresponder a uma variável de ambiente existente.
Se você espera que esteja usando uma variável que pode ser inicializada pelo ambiente dessa maneira (e se for indesejada), poderá desabilitá-la explicitamente antes da parte principal do seu script:
o que também a removeria como uma variável de ambiente ou, você pode simplesmente ignorar seu valor inicial e substituí-lo por uma atribuição (o que faria com que a variável de ambiente também alterasse o valor).
Você nunca encontraria lixo não inicializado em uma variável de shell (a menos que, como indicado, esse lixo já existisse em uma variável de ambiente com o mesmo nome).
fonte
unset
ting) antes de executar algum tipo defor
ouwhile
laço para defini-la para um calculado valor se houver alguma chance de que o loop não seja realmente executado devido às condições que não foram atendidas; e a variável pode ter sido configurada para algum outro valor no ambiente que o script herdou. Mas é sem dúvida melhor colocar tudo em amain()
e definir as variáveis comolocal
.:
, por exemplo,${myvariable-defaultvalue}
Edit : Opa, aparentemente a declaração é diferente da inicialização. De qualquer forma, deixarei isso aqui para que programadores iniciantes como eu possam aprender com o meu erro.
A vantagem de declarar variáveis locais em uma função é que você pode copiar facilmente o código.
Por exemplo, digamos que eu tenho uma função:
Se eu quiser transformá-lo em um script, simplesmente ignoro a
local
instrução e copio todo o resto:Se a declaração e a atribuição estivessem na mesma linha, eu teria que editar manualmente a
local
parte antes de poder transformá-la em um script:Neste exemplo, não é grande coisa, mas se você estiver lidando com funções maiores e mais complexas, pode ser mais doloroso.
fonte