Encontré un script que tiene una función que comprueba si se establece una variable pero no la entiendo muy bien.
check_if_variable_is_set() {
var_name=$1
if [ -z "${!var_name+x}" ]; then
false
else
true
fi
}
¿Qué sucede exactamente con esta sustitución?
bash
shell-script
variable-substitution
Karim Manaouil
fuente
fuente
Respuestas:
En el
bash
shell,${!var}
es una indirección variable. Se expande al valor de la variable cuyo nombre se mantiene$var
.La expansión de la variable
${var+value}
es una expansión POSIX que se expandevalue
si la variablevar
está configurada (no importa si su valor está vacío o no).Combinando estos,
${!var+x}
se expandiría ax
si se establece la variable cuyo nombre se mantiene$var
.Ejemplo:
(línea vacía como salida)
La función en la pregunta podría acortarse a
o incluso:
o incluso:
Dónde
-v
es unabash
prueba en un nombre de variable que será verdadera si la variable nombrada está establecida, y falsa en caso contrario.POSIXY, podría escribirse:
Tenga en cuenta que todas esas son vulnerabilidades potenciales de inyección de comandos si el argumento de esa función podría terminar bajo el control de un atacante. Prueba por ejemplo con
check_if_variable_is_set 'a[$(id>&2)]'
.Para protegerse de eso, es posible que desee verificar primero que el argumento sea un nombre de variable válido. Para variables:
(tenga en cuenta que
[[:alpha:]]
buscará caracteres alfabéticos en su localidad mientras que algunos shells solo aceptan caracteres alfabéticos del conjunto de caracteres portátil en su variable)fuente