3 回答
TA贡献1848条经验 获得超2个赞
避免使用可能带来的安全隐患的一种更好的方法eval是
declare "$var=$val"
请注意,这declare是typesetin 的同义词bash。该typeset命令得到更广泛的支持(ksh并且zsh也可以使用它):
typeset "$var=$val"
在的现代版本中bash,应使用nameref。
declare -n var=x
x=$val
它比更加安全eval,但仍然不够完美。
TA贡献1853条经验 获得超18个赞
Bash有一个扩展printf,可以将其结果保存到变量中:
printf -v "${VARNAME}" '%s' "${VALUE}"
这样可以防止所有可能的转义问题。
如果您对使用无效的标识符$VARNAME,该命令将失败并返回状态代码2:
$ printf -v ';;;' foobar; echo $?
bash: printf: `;;;': not a valid identifier
2
TA贡献1813条经验 获得超2个赞
eval "$var=\$val"
的参数eval应始终是用单引号或双引号引起来的单个字符串。在极端情况下,所有偏离此模式的代码都具有某些意外行为,例如带有特殊字符的文件名。
当evalshell扩展参数to时,将$var其替换为变量名,并将其\$替换为一个简单的美元。因此,评估的字符串变为:
varname=$value
这正是您想要的。
通常,所有形式的表达式都$varname应该用双引号引起来。只有两个地方可以省略引号:变量赋值和case。由于这是变量分配,因此此处不需要引号。不过,它们不会受到伤害,因此您也可以将原始代码编写为:
eval "$var=\"the value is $val\""
- 3 回答
- 0 关注
- 468 浏览
添加回答
举报