Encontrei um script que tem uma função que verifica se uma variável está definida mas não entendi muito bem.
check_if_variable_is_set() {
var_name=$1
if [ -z "${!var_name+x}" ]; then
false
else
true
fi
}
O que exatamente acontece com essa substituição?
No
bash
shell,${!var}
é uma indireção variável. Ele se expande para o valor da variável cujo nome é mantido em$var
.A expansão de variável
${var+value}
é uma expansão POSIX que se expandevalue
se a variávelvar
estiver definida (não importa se seu valor está vazio ou não).Combinando-os,
${!var+x}
expandiria parax
se a variável cujo nome é mantido$var
estiver definida.Exemplo:
(linha vazia como saída)
A função na pergunta pode ser encurtada para
ou ainda:
ou ainda:
Onde
-v
é umbash
teste em um nome de variável que será true se a variável nomeada for definida e false caso contrário.POSIXly, poderia ser escrito:
Observe que todas essas são vulnerabilidades potenciais de injeção de comando se o argumento para essa função puder acabar sob o controle de um invasor. Tente por exemplo com
check_if_variable_is_set 'a[$(id>&2)]'
.Para evitar isso, verifique primeiro se o argumento é um nome de variável válido. Para variáveis:
(observe que
[[:alpha:]]
verificará caracteres alfabéticos em sua localidade , enquanto alguns shells aceitam apenas caracteres alfabéticos do conjunto de caracteres portátil em sua variável)