我有一个bash脚本,我试图将带有引用值的posix样式参数传递给另一个名为within的脚本。在命令行上,我可以输入:
somescript --foo="bar baz"
这意味着对于具有键foo
的参数,值为bar baz
。在某些内容中,您可能认为这样可行:
innerscript "$@"
然而,这会重新引用每个参数的 complete ,键和值一起分块,而不仅仅是值。因此innerscript会收到"--foo=bar baz"
并认为您正在尝试使用空值传递名为foo=bar baz
的密钥。
告诉bash“重新引用所有传递的参数”是不够的。我需要告诉bash“重新引用所有传递的参数在之前引用它们的确切方式”。不要改变我的报价位置,兄弟!
答案 0 :(得分:3)
问题出在innerscript
,然后。之间没有区别:
innerscript --foo="bar baz"
innerscript "--foo=bar baz"
innerscript --foo=bar\ baz
innerscript --foo=bar' 'baz
毫无疑问,还有许多其他选择。在innerscript
内,$1
(在shell表示法中)只包含13个字符:--foo=bar baz
。顺便提一下,同样适用于somescript
;当你如图所示调用它时,它看不到双引号。它们由shell处理(并由shell删除)。
要看到这一点,请尝试:
echo --foo="bar baz"
答案 1 :(得分:1)
你做不到。
脚本接收参数。当shell 解析该行时,它将第一个参数传递为:
“--foo = bar baz”。你不能做任何事情来防止这种情况。但我不明白为什么会导致任何问题,你可以根据=
拆分参数。
# function test { echo $1; }
# test a"b""c"'d'\e
abcde
答案 2 :(得分:0)
使用getopt
命令解析参数和选项。
注1:getopt
(gnu命令)已增强getopts
(在POSIX中定义)。
注2:--long-options
是GNU风格,而不是POSIX