提问人:U. Bulle 提问时间:1/11/2021 最后编辑:U. Bulle 更新时间:1/11/2021 访问量:298
如何在 bash [duplicate] 中传递双引号的“--parameter value”字符串
How can I pass double quoted "--parameter value" strings in bash [duplicate]
问:
编辑:问题被标记为重复,请注意,值是以特定方式发送的,带有双引号,例如“--parameter value”“--parameter2 value2”
这个问题没有被问到,也没有答案。
问题
如果参数是双引号的,比如 ,我该如何传递它们,以便结束脚本可以将其视为?"--parameter value" "--parameter2 value2"
--parameter value --parameter2 value
如果我尝试(不带双引号),它仅在参数值不包含空格时才有效。如果我尝试,它根本不起作用。请参阅下面的方案,其中解释了三个文件的问题。$@
"$@"
现实生活场景
- GitHub 操作 () 调用带有双引号的参数名称和值对
action.yml
Dockerfile
"--parameter value" "--parameter2 value2"
Dockerfile
在其入口点调用一个 shell 脚本,期望参数为 (每个参数名称/值对没有双引号)。--parameter value --parameter2 value2
简化方案
调用流中有三个步骤:、 和 。而我只控制着.caller.sh
middleman.sh
script.sh
middleman
访客
入口点脚本。它以特定方式调用 ,其中每个参数名称和值都用双引号引起来。我无法控制此脚本的行为。middleman
因此,我们可以用如下所示来表示它:caller.sh
#!/usr/bin/env bash
./middleman.sh "--parameter1 value" "--parameter2 'value with whitespace'"
中间人
这是中间层,它应该从 中获取参数,并按照预期将它们转换为扩展参数。caller
script
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
答:
如何传递它们,以便结束脚本可以将其作为 --parameter value --parameter2 值?
正常通过:
./middleman.sh --parameter1 value --parameter2 'value with whitespace'
我怎样才能在这里打到正确的电话?
提供的代码是正确的,只是:
./script.sh "$@"
有关更多信息,请在 shell 中研究单词拆分、扩展和引用。这不是你如何传递参数,而是你如何“转发”和“解析”它们——这是正确的方式。"$@"
旁注:很特别 - in 不进行单词拆分,因此无需引用。我喜欢引用所有扩展,无论如何都会写。case
$1
case $1 in
case "$1" in
使用 shellcheck.net 检查您的脚本。
Aaaand在repl上进行了测试。
评论
caller.sh
how can I "normalize" those quoted parameters?
$@
action.yml
args
I'd appreciate feedback
不错的脚本;)我会合并它。
评论