如何在BASH中打印出一个数组,每个值之间有一个字段分隔符,末尾有一个换行符。
使用单个printf可以得到的最接近的值是printf '%s|' "${arr1[@]}"
,其中|是字段分隔符。这个问题是结尾没有换行符。我尝试在其中插入的任何组合要么在每个条目上插入换行符,要么根本没有!
有没有一种方法可以在一条线上完成,或者我需要使用printf '%s|' "${arr1[@]}";printf "n"
谢谢,
Geraint
是的,为此需要两个命令。CCD_ 3是完全传统的。
或者,如果您不想要尾随的|
,您可以临时修改IFS
以使用您选择的分隔符作为其第一个字符,并使用"${array[*]}"
:
IFS="|$IFS"; printf '%sn' "${array[*]}"; IFS="${IFS:1}"
如果您不想打印|
,也可以将其删除,然后放在一个空格或任何您想使用的分隔符(例如,或-)中:
printf '%s ' "${arr1[@]}" ; printf 'n'
如果你经常需要这个,你应该使用一个函数,因为一遍又一遍地写相同的代码不是最好的方法:
print_array ()
{
# run through array and print each entry:
local array
array=("$@")
for i in "${array[@]}" ; do
printf '%s ' "$i"
done
# print a new line
printf 'n'
}
用法:
print_array "${array_name[@]}"
示例:
array01=(one two three)
print_array "${array01[@]}"
echo "this should be a new line"
输出:
one two three
this should be a new line
前面的答案很好。只是想提一下,你也可以在一个命令中轻松完成:
printf '%s ' "${arr1[@]}" $'n'
(虽然有点像echo "${arr1[*]}"
)
另一种衬垫可能是:
CCD_ 11-这将$IFS设置为"0"|&";,但是在圆括号中,因此$IFS将不会保持"0"|"贯穿剧本的其余部分。
此外,为了允许$IFS作为内联var,您可以创建一个函数:
print_array() {
echo "${arr1[*]}"
}
用法:
IFS="|" print_array "${arr1[@]}"
说明:"${arr1[*]}";只打印一个字符串中的所有元素,所有数组元素之间的第一个字符为$IFS。
只有我的两美分:)
编码很有趣!…:)