我如何通过双引号--参数值“;bash中的字符串

我如何通过双引号--参数值“;bash中的字符串,bash,shell,unix,whitespace,quotes,Bash,Shell,Unix,Whitespace,Quotes,编辑:问题被标记为重复,请注意,值是以特定方式发送的,带有双引号,如“--parameter value”“--parameter 2 value2”此问题未被询问,也没有答案 问题 如果参数被双引号引用,比如“--parameter value”“--parameter2 value2”,我如何传递它们,以便最终脚本可以将其作为--parameter value--parameter2 value 如果我尝试$@(不带双引号),则仅当参数值不包含空格时才有效。如果我尝试“$@”它根本不起作用。

编辑:问题被标记为重复,请注意,值是以特定方式发送的,带有双引号,如
“--parameter value”“--parameter 2 value2”
此问题未被询问,也没有答案

问题 如果参数被双引号引用,比如
“--parameter value”“--parameter2 value2”
,我如何传递它们,以便最终脚本可以将其作为
--parameter value--parameter2 value

如果我尝试
$@
(不带双引号),则仅当参数值不包含空格时才有效。如果我尝试
“$@”
它根本不起作用。请参阅下面解释三个文件问题的场景

现实生活场景
  • GitHub操作(
    action.yml
    )调用带有双引号的参数名称和值对的
    Dockerfile
    “--parameter value”“--parameter 2 value2”
  • Dockerfile
    在其入口点调用一个shell脚本,该脚本期望参数为
    --参数值--参数2值2
    (每个参数名称/值对不带双引号)
  • 简化情景 调用流程中有三个步骤:caller.sh,
    middleman.sh
    script.sh
    。我只控制着中间人

    呼叫者 入口点脚本。它以特定的方式调用
    中间人
    ,其中每个参数名称和值都是双引号我无法控制此脚本的行为。

    因此,我们可以用
    caller.sh
    表示它,如下所示:

    #/usr/bin/env bash
    ./middleman.sh--parameter1值“”--parameter2“带空格的值”
    
    中间人 这是中间层,应该从
    调用方
    获取参数,并将它们转换为
    脚本所期望的扩展参数

    middleman.sh

    #/usr/bin/env bash
    ./script.sh“$@”
    
    这就是问题所在,因为这不起作用。我还尝试了不带双引号的
    $@
    ,但只有当参数值包含空格时,它才起作用。我怎么能在这里打对电话

    剧本 脚本应该以正确的方式获取参数。它希望接收参数,如
    --name-value

    其工作原理是按如下方式解析参数,例如打印参数:

    script.sh

    #/usr/bin/env bash
    而[[“$#””-gt 0];请把一美元放在箱子里
    --参数1)第一个参数=“2”;移位;;
    --参数2)第二个参数=“2”;移位;;
    *)echo“[script.sh]传递的未知参数:'$1';出口1;;
    以撒;转移;完成
    echo“[script.sh]参数1:$FIRST_PARAM,second参数:$second_PARAM”
    
    我无法修改此脚本

    运行测试
    /caller.sh

    如何传递它们,以便最终脚本可以将其作为--参数值--参数2值

    正常通过:

    ./middleman.sh --parameter1 value --parameter2 'value with whitespace'
    
    我怎么能在这里打对电话

    提供的代码是正确的,只是:

    ./script.sh "$@"
    
    有关更多信息,请在shell中进行分词扩展和引用。这不是你如何传递参数,而是你如何“转发”和“解析”它们——而
    “$@”
    是正确的方法

    旁注:
    案例
    是特殊的-案例
    中的
    $1
    不进行分词,因此无需引用。我喜欢引用所有扩展,并且无论如何都会在中写入
    案例“$1”

    使用shellcheck.net检查脚本


    aa和。

    嗨,非常感谢!但是我不能改变caller.sh的行为,它是静态的,不幸的是它总是在引号中调用参数名和值对。我用现实生活场景更新了这个问题。那么我如何“规范化”这些引用的参数呢?顺便说一句,我的问题是关闭的,因为重复。这个问题以前从未被提出过。。。?您不控制github操作吗<代码>如何“规范化”这些引用的参数?
    编写解析器。现在你也改变了报价。因此,编写一个解析器——在第一个空格之前和之后提取字符串,从这两个字符串中创建两个参数,并沿长度传递它们。像解析这样的简单解决方案,我无法坚持使用
    $@
    。很抱歉,我对这些引文不够清楚。我正在使用
    action.yml
    (自己的操作),它总是通过引用键/值参数对使用其
    args
    调用Dockerfile。我提出了这个解决方案,以支持正常参数输入和双引号输入。它工作正常:。我希望得到反馈,否则请随时更新您的答案,我会接受。
    我希望得到反馈
    Nice script;)我会合并它。