为什么shell把一个带引号的“$@”展开成多个参数

问题描述 投票:0回答:1

以下命令按预期打印

foo bar

sh -c 'printf "$@"' -- "foo bar"

但是,当以

foo
bar
作为单独的参数调用时,它只打印
foo
:

sh -c 'printf "$@"' -- foo bar

sh
bash
在这里有相同的行为)

这向我表明表达式

"$@"
被转换为多个参数,导致调用
printf foo bar
,而不是
printf "foo bar"

  1. 为什么会这样?我以为引号表示单个字符串?
  2. 如何更改
    sh -c
    命令以获得所需的行为 (
    printf "foo bar"
    ) 传递多个参数时?
string shell sh posix parameter-expansion
1个回答
1
投票

为什么会这样?

因为

$@
很特别

我以为引号表示单个字符串?

不是

$@
的情况。

传递多个参数时,如何更改 sh -c 命令以获得所需的行为(printf“foo bar”)?

您可以使用

"$*"
将参数与空格(来自 IFS 的第一个字符)连接起来。

来自https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html

2.5.2 特殊参数

@

[...] 当扩展发生在双引号内时 [...]

[...]初始字段应保留为单独的字段[...]

© www.soinside.com 2019 - 2024. All rights reserved.