如何在 bash [duplicate] 中传递双引号的“--parameter value”字符串

How can I pass double quoted "--parameter value" strings in bash [duplicate]

提问人:U. Bulle 提问时间:1/11/2021 最后编辑:U. Bulle 更新时间:1/11/2021 访问量:298

问:

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

问题

如果参数是双引号的,比如 ,我该如何传递它们,以便结束脚本可以将其视为?"--parameter value" "--parameter2 value2"--parameter value --parameter2 value

如果我尝试(不带双引号),它仅在参数值不包含空格时才有效。如果我尝试,它根本不起作用。请参阅下面的方案,其中解释了三个文件的问题。$@"$@"

现实生活场景

  1. GitHub 操作 () 调用带有双引号的参数名称和值对action.ymlDockerfile"--parameter value" "--parameter2 value2"
  2. Dockerfile在其入口点调用一个 shell 脚本,期望参数为 (每个参数名称/值对没有双引号)。--parameter value --parameter2 value2

简化方案

调用流中有三个步骤:、 和 。而我只控制着.caller.shmiddleman.shscript.shmiddleman

enter image description here

访客

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

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

#!/usr/bin/env bash

./middleman.sh "--parameter1 value" "--parameter2 'value with whitespace'"

中间人

这是中间层,它应该从 中获取参数,并按照预期将它们转换为扩展参数。callerscript

middleman.sh:

#!/usr/bin/env bash

./script.sh "$@"

这就是问题所在,因为这不起作用。我也尝试过不带双引号,但只有当参数值包含空格时它才有效。我怎样才能在这里打到正确的电话?$@

脚本

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

它的工作原理是解析参数,如下所示,例如打印它们:

script.sh:

#!/usr/bin/env bash

while [[ "$#" -gt 0 ]]; do case $1 in
  --parameter1) FIRST_PARAM="$2"; shift;;
  --parameter2) SECOND_PARAM="$2"; shift;;
  *) echo "[script.sh] Unknown parameter passed: '$1'"; exit 1;;
esac; shift; done

echo "[script.sh] parameter1: $FIRST_PARAM, second parameter: $SECOND_PARAM"

我无法修改此脚本。

运行测试

./caller.sh

Bash Shell Unix 空格 行情

评论


答:

1赞 KamilCuk 1/11/2021 #1

如何传递它们,以便结束脚本可以将其作为 --parameter value --parameter2 值?

正常通过:

./middleman.sh --parameter1 value --parameter2 'value with whitespace'

我怎样才能在这里打到正确的电话?

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

./script.sh "$@"

有关更多信息,请在 shell 中研究单词拆分、扩展和引用。这不是你如何传递参数,而是你如何“转发”和“解析”它们——这是正确的方式。"$@"

旁注:很特别 - in 进行单词拆分,因此无需引用。我喜欢引用所有扩展,无论如何都会写。case$1case $1 incase "$1" in

使用 shellcheck.net 检查您的脚本。

Aaaand在repl上进行了测试

评论

0赞 U. Bulle 1/11/2021
嗨,非常感谢!但是我无法更改 的行为,它是静态的,不幸的是,它总是在引号中调用参数名称和值对。我用现实生活中的场景更新了这个问题。那么,我怎样才能“归一化”这些引用的参数呢?顺便说一句,我的问题由于重复而关闭。这个问题以前从未被说过......caller.sh
0赞 KamilCuk 1/11/2021
?你不控制 github 操作吗? 编写一个解析器。现在你也改变了报价。因此,编写一个解析器 - 提取第一个空格之前和第一个空格之后的字符串,从这两个字符串创建两个参数并传递它们how can I "normalize" those quoted parameters?
1赞 U. Bulle 1/12/2021
谢谢。一个简单的解决方案,比如解析,我想不出坚持下去。很抱歉对报价不够清楚。我正在使用(自己的操作),它总是通过引用键/值参数对来调用 Dockerfile。我想出了这个解决方案来支持正常参数输入和双引号,它工作正常:gist.githubusercontent.com/undergroundwires/......我将不胜感激,否则请随时更新您的答案,我会接受的。$@action.ymlargs
0赞 KamilCuk 1/12/2021
I'd appreciate feedback不错的脚本;)我会合并它。