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



如何在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。

只有我的两美分:)

编码很有趣!…:)

最新更新