bash 特殊参数 $@ 是否被视为 printf 中的循环?

Jim*_*Jim 5 shell bash parameter shell-script

所以我正在测试以下内容:

foo() {  
  printf "\nAll the parameters, each on a separate line:\n"  
  printf "param: %s\n" "$@"  
}  

foo The "nicely colored" rainbow  
Run Code Online (Sandbox Code Playgroud)

输出是:

All the parameters:  
param: The
param: nicely colored
param: rainbow
Run Code Online (Sandbox Code Playgroud)

所以如果我理解正确,因为IFS设置为\t\n我们得到由制表符分隔的参数( 的第一个字符IFS)。
但是为什么它们被打印在不同的行中?
是为每个参数运行 printf 。即 bash 是否将其转换为 for 循环?
以下(不带双引号)也输出相同的结果:

printf "param: %s\n" $@

phe*_*mer 17

这里发生的事情是,当您传递的printf参数多于 (%s和其他东西) 的位置格式参数时,它将重复格式。它在多行上重复,因为您有\n格式字符串。没有什么特别的$@在这种情况下。

例如:

$ printf 'Foo: %s\n' bar baz
Foo: bar
Foo: baz

$ printf 'Foo: %s %s\n' bar baz
Foo: bar baz
Run Code Online (Sandbox Code Playgroud)

  • 如果你想知道 `$*` 和 `$@` 之间的区别,我建议你去寻找[专门关于那个的问题](https://unix.stackexchange.com/questions/41571/what-is-the-和之间的差异) (5认同)