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

时间:2017-01-31 17:09:19

标签: 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"

我得到了:

  

错误:未知参数WITH

我在主题上阅读了几个主题,但无法找到解决方案: https://superuser.com/questions/360966/how-do-i-use-a-bash-variable-string-containing-quotes-in-a-command http://mywiki.wooledge.org/BashFAQ/050

尝试使用单引号和双引号,将param存储在变量等中但没有骰子。

如果我使用

chroot /sites/FOLDER1 /bin/su FOLDER2 -c '/data/batch/myScript.sh -v -g -action params -customer 'NAME WITH SPACE''

它工作得好一点,因为我没有得到未知参数,但它只将NAME作为参数并忽略空格后的内容

1 个答案:

答案 0 :(得分:3)

su -c "script-text"启动一个单独的shell解释器,它将script-text解析为代码。因此,该文本需要以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/sh ,那么您应该考虑生成纯POSIX兼容输出的替代实现,例如Python pipes.quote()库提供的输出功能:

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"