J'ai trouvé un script qui a une fonction qui vérifie si une variable est définie mais je ne la comprends pas très bien.
check_if_variable_is_set() {
var_name=$1
if [ -z "${!var_name+x}" ]; then
false
else
true
fi
}
Que se passe-t-il exactement avec cette substitution?
bash
shell-script
variable-substitution
Karim Manaouil
la source
la source
Réponses:
Dans le
bash
shell,${!var}
est une indirection variable. Il se développe à la valeur de la variable dont le nom est conservé$var
.L'expansion de variable
${var+value}
est une extension POSIX qui se développevalue
si la variablevar
est définie (que sa valeur soit vide ou non).La combinaison de ces derniers
${!var+x}
se développeraitx
si la variable dont le nom est conservé$var
est définie.Exemple:
(ligne vide en sortie)
La fonction dans la question pourrait être réduite à
ou même:
ou même:
Où
-v
est unbash
test sur un nom de variable qui sera vrai si la variable nommée est définie, et faux sinon.POSIX, il pourrait s'écrire:
Notez que ce sont toutes des vulnérabilités potentielles d'injection de commandes si l'argument de cette fonction pourrait finir par être sous le contrôle d'un attaquant. Essayez par exemple avec
check_if_variable_is_set 'a[$(id>&2)]'
.Pour éviter cela, vous pouvez d'abord vérifier que l'argument est un nom de variable valide. Pour les variables:
(notez que
[[:alpha:]]
cela vérifiera les caractères alphabétiques dans votre région tandis que certains shells n'acceptent que les caractères alphabétiques du jeu de caractères portable dans leur variable)la source