Initializing Bash variables - É obrigatório, recomendado ou definido à medida que você for

10

Existe alguma vantagem / desvantagem de inicializar o valor de uma variável bash no script, antes do código principal, ou variáveis locais em uma função antes de atribuir o valor real a ela?

Eu preciso fazer algo assim:

init()
{
    name=""
    name=$1
}

init "Mark"

Existe algum risco de variáveis serem inicializadas com valores de lixo (se não forem inicializados) e que tenham um efeito negativo dos valores das variáveis?

    
por Cyrus 21.08.2018 / 17:48

2 respostas

20

Não há nenhum benefício em atribuir uma cadeia vazia a uma variável e, em seguida, atribuir imediatamente outra cadeia variável a ela. Uma atribuição de um valor a uma variável de shell sobrescreverá completamente seu valor anterior.

Não tenho conhecimento de nenhuma recomendação que diga que você deve inicializar explicitamente as variáveis para sequências vazias. Na verdade, isso pode mascarar erros em algumas circunstâncias (erros que, de outra forma, seriam aparentes se executados em set -u , veja abaixo).

Uma variável não definida, não usada desde o início de um script ou explicitamente não definida, executando o comando unset , não terá valor. O valor de tal variável será nada. Se usado como "$myvariable" , você receberá o equivalente a "" .

Se a opção nounset do shell for definida com set -o nounset ou set -u , a referência a uma variável não definida fará com que o shell produza um erro (e um shell não interativo terminaria):

$ set -u
$ echo "$myvariable"
/bin/sh: myvariable: parameter not set

ou, em bash :

$ set -u
$ echo "$myvariable"
bash: myvariable: unbound variable

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 você esteja usando uma variável que pode ser inicializada pelo ambiente dessa forma (e se ela não for desejada), você pode desmarcá-la explicitamente antes da parte principal do seu script:

unset myvariable    # unset so that it doesn't inherit a value from the environment

que também o removeria como uma variável de ambiente, ou você pode simplesmente ignorar seu valor inicial e apenas sobrescrevê-lo com uma atribuição (o que também tornaria o valor de mudança da variável de ambiente).

Você nunca encontrará lixo não inicializado em uma variável de shell (a menos que, como dito, o lixo já exista em uma variável de ambiente com o mesmo nome).

    
por 21.08.2018 / 17:58
2

A vantagem de declarar variáveis locais em uma função é que você pode facilmente copiar o código.

Por exemplo, digamos que eu tenha uma função no meu .bashrc:

foo(){
    local name
    name="$1"
    echo "$name"
}

Se eu quiser transformá-lo em um script, simplesmente ignore a instrução local e copie todo o resto:

#!/bin/bash
name="$1"
echo "$name"

Se a declaração e a atribuição estivessem na mesma linha, eu teria que editar manualmente a parte local antes que eu pudesse transformá-la em um script:

foo(){
    local name="$1"
    echo "$name"
}

Neste exemplo, não é grande coisa, mas se você está lidando com funções maiores e mais complexas, pode ficar mais doloroso.

    
por 21.08.2018 / 21:38

Tags