Bash:为什么printf不尊重换行符?

时间:2018-03-07 23:11:48

标签: bash

为什么这个bash脚本(在底部)不输出换行符?结果是:

filesonetwothree

而不是

files
one
two
three

这是脚本:

files=()
files+="one"
files+="two"
files+="three"

printf "\nfiles"
for file in "${files[@]}"
do
    printf "$file\n"
done

注意:这是在运行macOS Sierra的Mac上

1 个答案:

答案 0 :(得分:4)

以下内容将使您的问题非常明确:

files=()
files+="one"
files+="two"
files+="three"
declare -p files

...作为输出发出:

declare -a files='([0]="onetwothree")'

...所以,您将附加到数组的第一个元素,而不是将新元素添加到数组的结尾。

要正确附加到数组,请改用以下内容:

files=()
files+=("one")
files+=("two")
files+=("three")
declare -p files

......发出:

declare -a files='([0]="one" [1]="two" [2]="three")'

在任何一种情况下,要打印一行到一个元素的数组,请使用带换行符的格式字符串,并将数组元素作为后续参数传递:

printf '%s\n' "${files[@]}"