变量含撇号时多层引号嵌套下的Shell命令执行问题
解决$STRING含撇号时命令失效的问题
问题根源
原命令中,drush ev 'somethingelse("$STRING",[]);' 里的单引号会被shell解析,当$STRING包含撇号(')时,会破坏单引号的闭合结构,导致shell语法错误。比如$STRING为It's me时,展开后变成'somethingelse("It's me",[]);',shell会将'somethingelse("It's'视为一个不完整的单引号字符串,后续内容直接引发语法错误。
解决方案
对$STRING中的撇号进行转义,使其能在单引号字符串中正确表示。在shell语法里,单引号内的撇号需要用'\''来转义(原理是:先闭合当前单引号,添加一个可被识别的撇号,再重新打开单引号)。
修改后的命令如下:
xargs -0 somescript -C << EOF drush ev 'somethingelse("${STRING//\'/\'\\\'\'}",[]);' EOF
关键细节说明
${STRING//\'/\'\\\'\'}是shell的参数替换语法:将$STRING中的所有'替换为'\'',确保变量展开后不会破坏单引号的语法结构。- 这里使用无引号的
EOF作为heredoc标记,让shell正常展开${STRING//...}变量。
你之前的嵌套heredoc报错原因
你尝试的嵌套heredoc写法中,somescript -C执行的是一个嵌套的heredoc结构,shell解析时会将EOF2后的内容当作新的独立命令,导致somethingelse(...)中的括号被误判为语法错误;同时$STRING在单引号标记的EOF2 heredoc中不会被展开,根本无法传递正确的变量值。
内容的提问来源于stack exchange,提问作者chx
相关产品推荐
相关产品推荐

