如何通过字符串变量执行包含字符串变量的命令?
如何通过字符串变量执行包含字符串变量的命令?
这个问题我太熟了,本质是shell处理引号和参数拆分的逻辑在搞鬼,我给你拆解清楚:
为什么你的原命令会报错?
当你执行X="bash -c 'echo OK'" ; $X时,shell的解析流程是这样的:
- 给变量
X赋值时,单引号只是用来包裹echo OK,让它成为字符串的一部分; - 执行
$X时,shell会把X的内容按空格分词拆分,变成bash、-c、'echo、OK'这四个独立的部分; - 这时候
bash -c拿到的参数是'echo,它会认为你在写一个带单引号的命令,但找不到闭合的单引号,自然就抛出了unexpected EOF while looking for matching''`的错误。
简单说:赋值时的引号只是用来定义字符串,执行$X时shell不会再把这些引号当成“参数边界”,只会把它们当成普通字符。
满足你要求的两种解决方法
你明确要求必须用$X执行,且必须通过bash -c,这里给你两种可行方案:
方案1:转义内层引号,让shell正确识别参数边界
把内层的单引号换成转义的双引号,这样shell在拆分$X时,会把"echo OK"当成一个完整的参数传给bash -c:
X="bash -c \"echo OK\"" ; $X
执行这个命令就能正常输出OK了。
方案2:用数组存储(更安全的推荐方案)
如果允许稍微调整变量的存储方式,用数组来存命令和参数是更稳妥的选择——数组会保留每个参数的独立性,不会出现分词错误:
X=(bash -c 'echo OK') ; "${X[@]}"
这种写法完全规避了引号解析的陷阱,而且同样满足你“通过变量执行命令”的要求。
额外提醒
如果后续你的命令里有更多变量或者复杂逻辑,尽量优先用数组,避免用字符串存储命令——字符串存储很容易因为空格、特殊字符、引号嵌套出现各种奇怪的解析错误,数组是shell处理复杂命令参数的最佳实践。
备注:内容来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

