在bash中传递带引号的Posix参数值
我有一个bash脚本,试图将带有引号的posix样式的参数传递给另一个名为in的脚本。在命令行上,我可以键入:在bash中传递带引号的Posix参数值,bash,unix,posix,quotes,Bash,Unix,Posix,Quotes,我有一个bash脚本,试图将带有引号的posix样式的参数传递给另一个名为in的脚本。在命令行上,我可以键入: somescript --foo="bar baz" 这意味着如果参数具有键foo,则值为bar baz。在somescript中,您可能会认为这是可行的: innerscript "$@" 但是,这会重新引用每个参数的全部内容,包括键和值,而不仅仅是值。因此,innerscript接收到“--foo=bar baz”,并认为您正在尝试传递名为foo=bar baz的键,该键的值为
somescript --foo="bar baz"
这意味着如果参数具有键foo
,则值为bar baz
。在somescript中,您可能会认为这是可行的:
innerscript "$@"
但是,这会重新引用每个参数的全部内容,包括键和值,而不仅仅是值。因此,innerscript接收到“--foo=bar baz”
,并认为您正在尝试传递名为foo=bar baz
的键,该键的值为空
告诉bash“重新引用所有传入的参数”是不够的。我需要告诉bash“重新引用所有传入的参数,确切地说它们以前是如何被引用的”。不要改变我的报价,兄弟 你不能那样做
脚本接收参数。当shell解析该行时,它将第一个参数传递为:
“--foo=bar baz”。你不能做任何事情来防止这种情况。但是我不明白为什么这会导致任何问题,您可以根据=
分割参数
# function test { echo $1; }
# test a"b""c"'d'\e
abcde
你不能那样做
脚本接收参数。当shell解析该行时,它将第一个参数传递为:
“--foo=bar baz”。你不能做任何事情来防止这种情况。但是我不明白为什么这会导致任何问题,您可以根据=
分割参数
# function test { echo $1; }
# test a"b""c"'d'\e
abcde
问题出在
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
;如图所示调用它时,它不会看到双引号。它们由外壳处理(并移除)
要查看此信息,请尝试:
echo --foo="bar baz"
问题出在
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
;如图所示调用它时,它不会看到双引号。它们由外壳处理(并移除)
要查看此信息,请尝试:
echo --foo="bar baz"
对于解析参数和选项,请使用
getopt
命令
注1:getopt
(gnu命令)增强了getopts
(在POSIX中定义)
注2:
--长选项
是GNU样式,而不是POSIX用于解析参数,选项使用getopt
命令
注1:getopt
(gnu命令)增强了getopts
(在POSIX中定义)
注2:
--长选项
是GNU风格的,而不是POSIX请参见。请参见。问题在于我对innerscript的理解。你是对的。它没有像我想象的那样完全独立于位置的选项。问题在于我对innerscript的理解。你是对的。它没有像我想象的那样完全独立于位置的选项。