You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

以其他用户身份执行Bash脚本时传递带空格字符串参数出现语法错误

以其他用户身份执行Bash脚本时传递带空格字符串参数出现语法错误

嗨,我来帮你解决这个问题!你遇到的是Bash里嵌套引号处理的典型坑——当用su -c传递带空格的字符串时,直接转义引号很容易让Shell解析混乱,最终导致找不到匹配的引号,出现你看到的unexpected EOF错误。

问题根源分析

你原来的命令里,引号嵌套逻辑太绕了:

su - $user -s /bin/bash -c 'wp post create --post_title='\'$post_title\'' --post_content='\'$post_content\'' --path='$path'' 2>&1

Shell在解析时,会把单引号和转义的引号拆成不完整的片段,没法正确识别带空格的变量是一个整体参数,自然就抛出语法错误了。

两种可行的解决方案

方案1:调整引号层级,用双引号包裹整个命令字符串

把传给-c的命令用双引号整体包住,内部的变量参数再用双引号括住,这样空格就能被Shell正确识别为参数的一部分:

user=$1
domain=$2
post_title='post title example'
post_content='post content example'
path="/home/$user/web/$domain/public_html"

su - $user -s /bin/bash -c "wp post create --post_title=\"$post_title\" --post_content=\"$post_content\" --path=\"$path\"" 2>&1

这里的关键是:外层双引号确保整个命令作为一个字符串传给su的-c选项,内部的\"转义双引号则保证带空格的变量被当作单个参数传递给wp命令。

方案2:使用Here-Doc(更直观,彻底避开引号嵌套)

Here-Doc是一种更清晰的写法,它能把指定范围内的内容直接作为命令执行,完全不用纠结引号嵌套的问题:

user=$1
domain=$2
post_title='post title example'
post_content='post content example'
path="/home/$user/web/$domain/public_html"

su - $user -s /bin/bash <<EOF
wp post create --post_title="$post_title" --post_content="$post_content" --path="$path" 2>&1
EOF

这种方式下,EOF之间的内容会完整传递给切换后的用户Shell执行,变量会被正确展开,带空格的字符串也能完整保留。

验证效果

两种方案都能解决你遇到的语法错误,确保post_title和post_content里的空格被正确识别,wp命令能接收到完整的标题和内容参数。

备注:内容来源于stack exchange,提问作者ahmat arnal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:09:10