No momento, estou escrevendo uma estrutura de teste bash, onde em uma função de teste, tanto os testes padrão do bash ( [[
) quanto os matchers predefinidos podem ser usados. Matchers são wrappers para '[[' e além de retornar um código de retorno, defina alguma mensagem significativa dizendo o que era esperado.
Exemplo:
string_equals() {
if [[ ! $1 = $2 ]]; then
error_message="Expected '$1' to be '$2'."
return 1
fi
}
Portanto, quando um matcher é usado e falha, somente então um error_message é definido.
Agora, em algum ponto depois, eu testo se os testes foram bem-sucedidos. Se deu certo, imprimo a expectativa em verde, se falhou em vermelho.
Além disso, pode haver um error_message definido, então eu testo se uma mensagem existe, imprimo-a e, em seguida, cancelo a definição (porque o teste a seguir pode não definir um error_message
):
if [[ $error_message ]]; then
printf '%s\n' "$error_message"
unset -v error_message
fi
Agora minha pergunta é, se é melhor remover a variável ou apenas defini-la como '', como
error_message=''
Qual é o melhor? Isso realmente faz diferença? Ou talvez eu deva ter um sinalizador adicional indicando que a mensagem foi definida?
error_message
com qualquer outra coisa, eu diria que não importa. No entanto, acho que você deseja[[ $error_message ]]
, caso contrário, você está testando se a string literal "mensagem_erro" existe.Respostas:
Geralmente você não vê diferença, a menos que esteja usando
set -u
:Então, realmente, depende de como você vai testar a variável.
Acrescentarei que a minha forma preferida de testar, se estiver definida, é:
ou
fonte
var=
não está "não definido". É apenas uma string vazia não citada. Além dissoset -u
, as várias formas de expansão de parâmetro do bash também podem distinguir entre valores não definidos e nulos:${foo:bar}
expande para "bar" quandofoo
não está definido, mas "" quandofoo
é nulo, enquanto se${foo:-bar}
expande para "bar" se foo não está definido ou é nulo.[[ -n $var ]]
é falso sevar
for definido como uma string vazia.${foo-bar}
vez de${foo:bar}
. teste por si mesmo:unset a; echo ">${a:-foo}-${a:foo}-${a-foo}<"
Como já foi dito, usar unset é diferente com matrizes também
fonte
Portanto, ao remover a definição do índice 2 do array, você essencialmente remove aquele elemento do array e diminui o tamanho do array (?).
Eu fiz meu próprio teste ..
O que resulta em..
Portanto, apenas para esclarecer que remover a configuração de todo o array irá removê-lo completamente.
fonte
Com base nos comentários acima, aqui está um teste simples:
Exemplo:
fonte