在bash中传递引用的Posix参数值

时间:2011-09-16 23:32:50

标签: bash unix posix quotes

我有一个bash脚本,我试图将带有引用值的posix样式参数传递给另一个名为within的脚本。在命令行上,我可以输入:

somescript --foo="bar baz"

这意味着对于具有键foo的参数,值为bar baz。在某些内容中,您可能认为这样可行:

innerscript "$@"

然而,这会重新引用每个参数的 complete ,键和值一起分块,而不仅仅是值。因此innerscript会收到"--foo=bar baz"并认为您正在尝试使用空值传递名为foo=bar baz的密钥。

告诉bash“重新引用所有传递的参数”是不够的。我需要告诉bash“重新引用所有传递的参数之前引用它们的确切方式”。不要改变我的报价位置,兄弟!

3 个答案:

答案 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