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

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

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

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

foo The "nicely colored" rainbow  

输出是:

All the parameters:  
param: The
param: nicely colored
param: rainbow

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

printf "param: %s\n" $@

答案1

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

例如:

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

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

相关内容