【问题标题】:BASH printf array with field separator and newline on last entryBASH printf 数组,最后一个条目带有字段分隔符和换行符
【发布时间】:2014-12-05 21:49:24
【问题描述】:

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

我可以用单个 printf 得到的最接近的是 printf '%s|' "${arr1[@]}" 其中 |是字段分隔符。问题是最后没有换行符。 \n 我尝试放入其中的任何组合要么在每个条目上放置一个换行符,要么根本没有!

有没有办法在一行上做,还是我需要使用printf '%s|' "${arr1[@]}";printf "\n"

谢谢,

杰兰特

【问题讨论】:

  • printf '%s|' "${arr1[@]}"; echo

标签: bash printf


【解决方案1】:

是的,您需要两个命令。 printf '%s|' "${array[@]}"; echo 非常传统。

或者,如果您不想要结尾的|,您可以临时修改IFS 以使用您选择的分隔符作为其第一个字符,并使用"${array[*]}"

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

【讨论】:

  • 或者只是(IFS="|$IFS"; printf '%s\n' "${array[*]}"),使用子shell将更改本地化为IFS
  • 或者只是printf '%s\n' "${array[@]}"
  • @ϹοδεMεδιϲ,每行打印一个数组元素,这不是 OP 所要求的;他们希望将整个数组放在一行上(使用给定的分隔符——在本例中为管道字符——在它们之间),并在该行的末尾有一个换行符。
  • 对不起,我看错了!这个可以工作(IFS="|"; echo "${array[*]}") 或者你可以避免使用join_array() { local IFS="$1"; shift; echo "$*"; } 后跟join_array '|' "${array[@]}" 的子shell
【解决方案2】:

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

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

【讨论】:

  • 您可能还想声明local i,以免在外部范围内更改该变量的值。
猜你喜欢
  • 1970-01-01
  • 2011-01-01
  • 2012-01-30
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
相关资源
最近更新 更多