【问题标题】:Bash command with a shell script variable which itself as a parameter with spaces带有 shell 脚本变量的 Bash 命令,该变量本身作为带空格的参数
【发布时间】:2017-02-01 01:16:35
【问题描述】:

试图进行叠瓦式逃生,但这显然行不通。 我的带空格的参数是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

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

如果我使用

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

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

【问题讨论】:

    标签: bash parameters


    【解决方案1】:

    su -c "script-text" 启动一个单独的 shell 解释器,它将script-text 解析为代码。因此,该文本需要以eval-safe 方式转义。 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"
    

    如果您的/bin/sh 不是 bash 提供的,那么您应该考虑另一种实现,生成纯 POSIX 兼容的输出,例如 Python pipes.quote() 库函数提供的输出: p>

    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"
    

    【讨论】:

    • 谢谢,但我仍然收到Unknown parameter WITH
    • declare -- cmd="/data/batch/myScript.sh -v -g -action params -customer NAME\\ WITH\\ SPACE "
    • chroot /sites/FOLDER1 /bin/su FOLDER2 -c "$cmd"
    • 从聊天中总结:myScript.sh 中有一个错误,使用$* 而不是"$@" 来迭代参数;修复后,给定的解决方案现在可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2015-04-18
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2020-11-02
    相关资源
    最近更新 更多