以下命令按预期打印
foo bar
:
sh -c 'printf "$@"' -- "foo bar"
但是,当以
foo
和 bar
作为单独的参数调用时,它只打印 foo
:
sh -c 'printf "$@"' -- foo bar
(
sh
和 bash
在这里有相同的行为)
这向我表明表达式
"$@"
被转换为多个参数,导致调用printf foo bar
,而不是printf "foo bar"
。
sh -c
命令以获得所需的行为 (printf "foo bar"
)
传递多个参数时?为什么会这样?
因为
$@
很特别
我以为引号表示单个字符串?
不是
$@
的情况。
传递多个参数时,如何更改 sh -c 命令以获得所需的行为(printf“foo bar”)?
您可以使用
"$*"
将参数与空格(来自 IFS 的第一个字符)连接起来。
来自https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html:
2.5.2 特殊参数
@
[...] 当扩展发生在双引号内时 [...]
[...]初始字段应保留为单独的字段[...]