Eu encontrei um script que tem uma função que verifica se uma variável está definida, mas eu não a entendo 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?
bash
shell-script
variable-substitution
Karim Manaouil
fonte
fonte
Respostas:
No
bash
shell,${!var}
é uma variável indireta. Ele se expande para o valor da variável cujo nome é mantido$var
.A expansão da variável
${var+value}
é uma expansão POSIX que se expande paravalue
se a variávelvar
estiver configurada (independentemente de seu valor estar vazio ou não).Combinando isso,
${!var+x}
seria expandido parax
se a variável cujo nome é mantido$var
estiver definida.Exemplo:
(linha vazia como saída)
A função na pergunta pode ser reduzida para
ou até:
ou até:
Onde
-v
está umbash
teste em um nome de variável que será verdadeiro se a variável nomeada estiver configurada e false caso contrário.POSIX, poderia ser escrito:
Observe que todas essas são vulnerabilidades em potencial 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, convém verificar se o argumento é um nome de variável válido primeiro. Para variáveis:
(observe que
[[:alpha:]]
irá procurar caracteres alfabéticos em seu local, enquanto alguns shells aceitam apenas caracteres alfabéticos do conjunto de caracteres portáteis em suas variáveis)fonte