在我的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)。
答案 0 :(得分:6)
这是记录和预期的行为。如果传递给printf
的字符串多于格式字符串可以处理的字符串,则将重复该格式字符串。
"${array[@]}"
扩展为每个数组元素的shell字。因此,对于具有两个元素的数组,将传递printf
的两个参数;如果格式字符串只有一个占位符(只有一个%s
),那么它将重复。
相比之下,"${array[*]}"
(带引号!)将扩展为仅一个参数(第一个字符为IFS
,默认情况下为空格,插入每个元素之间)。
要求Bash通过POSIX specification执行此操作,重点如下:
- 格式操作数必须经常被重用以满足参数操作数。任何额外的c或s转换说明符都应被评估,就像提供了一个空字符串参数一样;应评估其他额外的转换规范,就好像提供了零参数一样。如果 format 操作数不包含转换规范且存在参数操作数,则结果未指定。
醇>
因此,此行为可移植到所有符合POSIX的shell。
答案 1 :(得分:2)
这是预期的:来自help printf
:
根据需要重用该格式以使用所有参数。如果 参数少于格式要求的额外格式 规范的行为就像零值或空字符串一样,视情况而定 已经供应了。