我找到了一个脚本,该脚本具有检查是否设置了变量的功能,但我不太了解它。
check_if_variable_is_set() {
var_name=$1
if [ -z "${!var_name+x}" ]; then
false
else
true
fi
}
这种替换究竟会发生什么?
我找到了一个脚本,该脚本具有检查是否设置了变量的功能,但我不太了解它。
check_if_variable_is_set() {
var_name=$1
if [ -z "${!var_name+x}" ]; then
false
else
true
fi
}
这种替换究竟会发生什么?
在
bash
shell中,${!var}
是一个变量间接。它扩展为名称保存在 中的变量的值$var
。变量扩展
${var+value}
是一个 POSIX 扩展,value
如果设置了变量var
(无论它的值是否为空),它都会扩展。结合这些,
${!var+x}
将扩展为x
是否设置了名称保存的变量$var
。例子:
(空行作为输出)
问题中的功能可以缩短为
甚至:
甚至:
where
-v
是bash
对变量名的测试,如果设置了命名变量,则为 true,否则为 false。POSIXly,它可以写成:
请注意,如果该函数的参数最终可能受到攻击者的控制,那么所有这些都是潜在的命令注入漏洞。例如尝试使用
check_if_variable_is_set 'a[$(id>&2)]'
.为了防止这种情况,您可能需要首先验证参数是否是有效的变量名。对于变量:
(请注意,这
[[:alpha:]]
将检查您的语言环境中的字母字符,而某些 shell 仅接受其变量中可移植字符集中的字母字符)