printf'%s \ n'是否正常? " $ {阵列[@]}"每个数组元素打印一行?

时间:2016-09-25 18:00:58

标签: arrays bash

在我的bash脚本中,我包含了程序所需的其他文件数组。然后我在帮助说明中打印出来。当我使用printf作为输出时,我得到了我没想到的结果。我已经读过表格$ {array [@]}通常是首选的扩展默认值,所以我从那开始。

我的阵列声明:

 scriptDependencies=("script1.sh" "script2.sh")

和(初始)printf命令:

printf "Dependencies: %s\n" "${scriptDependencies[@]}"

我得到的是输出:

 Dependencies: script1.sh
 Dependencies: script2.sh

虽然我相信我理解下标之间的基本区别' @'和' *'作为所有单个元素与所有组合在一起的元素,我没想到要打印两个单独的行。

当我切换printf命令以使用$ {scriptDependencies [*]}表单时,打印了一行(更接近我想要的):

 Dependencies: script1.sh script2.sh

这是printf和下标的预期行为吗?或者它是否指向printf的问题?

我使用GNU bash,版本3.2.57(1)-release(x86_64-apple-darwin15)。

2 个答案:

答案 0 :(得分:6)

这是记录和预期的行为。如果传递给printf的字符串多于格式字符串可以处理的字符串,则将重复该格式字符串。

"${array[@]}"扩展为每个数组元素的shell字。因此,对于具有两个元素的数组,将传递printf的两个参数;如果格式字符串只有一个占位符(只有一个%s),那么它将重复。

相比之下,"${array[*]}"(带引号!)将扩展为仅一个参数(第一个字符为IFS,默认情况下为空格,插入每个元素之间)。

要求Bash通过POSIX specification执行此操作,重点如下:

  
      
  1. 格式操作数必须经常被重用以满足参数操作数。任何额外的c或s转换说明符都应被评估,就像提供了一个空字符串参数一样;应评估其他额外的转换规范,就好像提供了零参数一样。如果 format 操作数不包含转换规范且存在参数操作数,则结果未指定。
  2.   

因此,此行为可移植到所有符合POSIX的shell。

答案 1 :(得分:2)

这是预期的:来自help printf

  

根据需要重用该格式以使用所有参数。如果       参数少于格式要求的额外格式       规范的行为就像零值或空字符串一样,视情况而定       已经供应了。