以其他用户身份执行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
相关产品推荐
相关产品推荐

