BASH printf 数组,最后一个条目带有字段分隔符和换行符

问题描述 投票:0回答:4

如何在 BASH 中打印出一个数组,每个值之间有一个字段分隔符,末尾有一个换行符。

我能用单个 printf 得到的最接近的是

printf '%s|' "${arr1[@]}"
其中 |是字段分隔符。问题是末尾没有换行符。任意组合 我尝试在每个条目上添加换行符或根本不添加换行符!

有没有一种方法可以在一行上完成,或者我需要使用

printf '%s|' "${arr1[@]}";printf "\n"

谢谢,

杰兰特

bash printf
4个回答
14
投票

是的,为此您需要两个命令。

printf '%s|' "${array[@]}"; echo
是完全传统的。

或者,如果您不想要结尾的

|
,您可以临时修改
IFS
以使用您选择的分隔符作为其第一个字符,并使用
"${array[*]}"
:

IFS="|$IFS"; printf '%s\n' "${array[*]}"; IFS="${IFS:1}"

4
投票

如果您不想打印

|
,您也可以将其删除并放入空格或您想要使用的任何分隔符(例如,或 -):

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

0
投票

前面的答案很好。 只是想提一下,您也可以通过一个命令轻松完成此操作:

printf '%s ' "${arr1[@]}" $'\n'
(虽然有点像
echo "${arr1[*]}"

另一句俏皮话可能是:

(IFS="|"; echo "${arr1[*]}")
- 这会将 $IFS 设置为“|”,但位于圆括号中,因此 $IFS 不会保留为“|”贯穿剧本的其余部分。

另外 - 要允许 $IFS 作为内联变量,您可以创建一个函数:

print_array() {
  echo "${arr1[*]}"
}

用途:

IFS="|" print_array "${arr1[@]}"

说明:“${arr1[*]}”打印一个字符串中的所有元素,$IFS 的第一个字符位于所有数组元素之间。

只是我的两分钱:)

祝你编码愉快!...:)


0
投票

这是一个单行解决方案,它将在最后一个数组元素之后生成一个新行:

list=(a b c)
printf '%b' "${list[@]}" '\n'

要点是将

%s
 中的 
%b
 替换为 
printf(根据
$ help printf

%b 在相应的参数中展开反斜杠转义序列

© www.soinside.com 2019 - 2024. All rights reserved.