Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中传递带引号的Posix参数值_Bash_Unix_Posix_Quotes - Fatal编程技术网

在bash中传递带引号的Posix参数值

在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的键,该键的值为

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

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的理解。你是对的。它没有像我想象的那样完全独立于位置的选项。