带有shell脚本变量的Bash命令,该脚本变量本身作为带有空格的参数

带有shell脚本变量的Bash命令,该脚本变量本身作为带有空格的参数,bash,parameters,Bash,Parameters,试图做叠瓦式逃生,但显然不起作用。 我的带空格的参数是customer,其值是NAME with space chroot /sites/FOLDER1 /bin/su FOLDER2 -c "/data/batch/myScript.sh -v -g -action params -customer NAME WITH SPACE" 我得到: 错误:具有未知参数 我读了一些关于这些主题的文章,但没有找到解决方案: 尝试使用单引号和双引号,将参数存储在变量等中,但不使用骰子 如果我使用 ch

试图做叠瓦式逃生,但显然不起作用。 我的带空格的参数是
customer
,其值是
NAME with space

chroot /sites/FOLDER1 /bin/su FOLDER2 -c "/data/batch/myScript.sh -v -g -action params -customer NAME WITH SPACE"
我得到:

错误:具有未知参数

我读了一些关于这些主题的文章,但没有找到解决方案:

尝试使用单引号和双引号,将参数存储在变量等中,但不使用骰子

如果我使用

chroot /sites/FOLDER1 /bin/su FOLDER2 -c '/data/batch/myScript.sh -v -g -action params -customer 'NAME WITH SPACE''
它工作得更好一点,因为我没有得到未知参数,但它只将名称作为参数,忽略空格后的内容

su-c“script text”
启动一个单独的shell解释器,将
脚本文本
解析为代码。因此,该文本需要以
eval
安全的方式转义
printf“%q”
为bash执行此操作(如果您的
/bin/sh
是bash的符号链接,那么它将非常健壮)

即:

printf -v cmd '%q ' /data/batch/myScript.sh -v -g -action params -customer "NAME WITH SPACE"
chroot /sites/FOLDER1 /bin/su FOLDER2 -c "$cmd"

如果您的BASH不提供代码< >/bin /s< /COD>,那么您应该考虑一个替代的实现,生成纯POSIX兼容的输出,如Python < Cudio>管道> .QuoTe](/Cult>库函数:

pyquote() {
  python -c 'import pipes, sys; print " ".join(pipes.quote(a) for a in sys.argv[1:])' "$@"
}

cmd=$(pyquote /data/batch/myScript.sh -v -g -action params -customer "NAME WITH SPACE")
chroot /sites/FOLDER1 /bin/su FOLDER2 -c "$cmd"

谢谢,但是我仍然可以用
声明--cmd=“/data/batch/myScript.sh-v-g-action params-customer NAME\\WITH\\SPACE”
chroot/sites/FOLDER1/bin/su FOLDER2-c“$cmd”
从聊天中总结出一个未知参数:
myScript.sh
,使用
$*
而不是
“$@”
对参数进行迭代;修复该问题后,给定的解决方案现在可以正常工作。