如何在 BASH 中打印出一个数组,每个值之间有一个字段分隔符,末尾有一个换行符。
我能用单个 printf 得到的最接近的是
printf '%s|' "${arr1[@]}"
其中 |是字段分隔符。问题是末尾没有换行符。任意组合
我尝试在每个条目上添加换行符或根本不添加换行符!
有没有一种方法可以在一行上完成,或者我需要使用
printf '%s|' "${arr1[@]}";printf "\n"
谢谢,
杰兰特
是的,为此您需要两个命令。
printf '%s|' "${array[@]}"; echo
是完全传统的。
或者,如果您不想要结尾的
|
,您可以临时修改 IFS
以使用您选择的分隔符作为其第一个字符,并使用 "${array[*]}"
:
IFS="|$IFS"; printf '%s\n' "${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[*]}"
)
另一句俏皮话可能是:
(IFS="|"; echo "${arr1[*]}")
- 这会将 $IFS 设置为“|”,但位于圆括号中,因此 $IFS 不会保留为“|”贯穿剧本的其余部分。
另外 - 要允许 $IFS 作为内联变量,您可以创建一个函数:
print_array() {
echo "${arr1[*]}"
}
用途:
IFS="|" print_array "${arr1[@]}"
说明:“${arr1[*]}”打印一个字符串中的所有元素,$IFS 的第一个字符位于所有数组元素之间。
只是我的两分钱:)
祝你编码愉快!...:)
这是一个单行解决方案,它将在最后一个数组元素之后生成一个新行:
list=(a b c)
printf '%b' "${list[@]}" '\n'
要点是将
%s
中的
%b
替换为
printf
(根据 $ help printf
)
%b 在相应的参数中展开反斜杠转义序列