shell脚本中for循环作为字符串传入eval执行不生效的原因是什么?
问题原因分析
问题的核心是Shell字符串的变量扩展时机差异:
- 双引号包裹的字符串会在定义赋值阶段就解析并展开内部以
$开头的变量。你定义cmd字符串时,当前环境的x变量没有赋值,$x会被直接替换为空值,最终cmd变量实际存储的内容为for x in This is good; do echo ; done,eval执行时自然会输出三次空行。 - 额外语法提醒:Shell变量赋值要求等号两侧不能有空格,你写的
cmd = "xxx"属于语法错误,执行时会直接报错,需要修改为cmd="xxx"。
解决方案
有两种常用方案可以规避变量提前扩展的问题:
- 方案1:用单引号定义cmd字符串,单引号会阻止内部变量提前扩展,
$x会作为字面量保留到eval执行阶段再解析:
cmd='for x in This is good; do echo $x ; done' eval "$cmd"
- 方案2:如果必须使用双引号(比如需要提前插入其他变量值到命令串中),给
$x的$符号添加转义符,避免提前展开:
cmd="for x in This is good; do echo \$x ; done" eval "$cmd"
内容的提问来源于stack exchange,提问作者kurokami
相关产品推荐
相关产品推荐

