Bash中如何仅对字符串做变量替换而不执行求值结果
错误原因
你执行eval $B时,$B会先展开为$A,eval处理时会先把它替换为This is something,之后会尝试将这段内容作为命令执行,因此抛出“This: command not found”错误。
推荐解决方案
方案1:变量间接引用(最优,无eval安全风险)
如果你的B变量固定存储单个带$前缀的变量名,可以直接用bash原生的间接展开功能,完全避免使用eval:
A="This is something" B='$A' varname="${B#\$}" # 移除变量值开头的$符号,得到纯变量名A echo "${!varname}" # 间接引用变量A,输出结果:This is something
这种写法没有代码注入风险,执行效率更高。
方案2:优化eval写法
如果你需要处理包含多个变量的复杂替换场景,必须使用eval的话,可以调整写法避免转义冗余,比你当前在用的写法更简洁:
A="This is something" B='$A' eval 'echo '"$B" # 或带双引号兼容特殊字符的写法 eval "echo \"$B\""
注意:使用eval时请确保B的内容完全可控,避免恶意构造的内容触发任意代码执行。
内容的提问来源于stack exchange,提问作者blueFast
相关产品推荐
相关产品推荐

