如何使用多行命令输出填充bash数组?

如何使用多行命令输出填充bash数组?,bash,Bash,如何使用多行命令输出填充bash数组 例如,给定此printf命令: $ printf 'a\nb\n\nc\n\nd\ne\nf\n\n' a b c d e f 我希望填充一个bash数组,就像我写的那样: $ arr[0]='a b' $ arr[1]='c' $ arr[2]='d e f' 因此,可以通过以下方式循环: $ for i in "${arr[@]}"; do printf "<%s>\n" "$i"; done <a b> <c>

如何使用多行命令输出填充bash数组

例如,给定此printf命令:

$ printf 'a\nb\n\nc\n\nd\ne\nf\n\n'
a
b

c

d
e
f
我希望填充一个bash数组,就像我写的那样:

$ arr[0]='a
b'
$ arr[1]='c'
$ arr[2]='d
e
f'
因此,可以通过以下方式循环:

$ for i in "${arr[@]}"; do printf "<%s>\n" "$i"; done
<a
b>
<c>
<d
e
f>

但这似乎有点笨拙,我不得不避开
的限制,因为我真的希望它告诉shell使用空格以外的字符作为数组字段分隔符。

一种最佳实践方法,使用NUL分隔符:

arr=( )
while IFS= read -r -d '' item; do
  arr+=( "$item" )
done < <(printf 'a\nb\n\0c\n\0d\ne\nf\n\0')
arr=()
当IFS=read-r-d“”项时,执行以下操作
arr+=(“$item”)

完成bash
4.4中的
mapfile
支持
-d
,今天发布。
$ declare -a arr="( $(printf '"a\nb" "c" "d\ne\nf"') )"
$ for i in "${arr[@]}"; do printf "<%s>\n" "$i"; done
<a
b>
<c>
<d
e
f>
arr=( )
while IFS= read -r -d '' item; do
  arr+=( "$item" )
done < <(printf 'a\nb\n\0c\n\0d\ne\nf\n\0')
mapfile -t -d '' arr < <(printf 'a\nb\n\0c\n\0d\ne\nf\n\0')
item=''
array=( )
while IFS= read -r line; do
  if [[ $line ]]; then
    if [[ $item ]]; then
      item+=$'\n'"$line"
    else
      item="$line"
    fi
  else
    [[ $item ]] && {
      array+=( "$item" )
      item=''
    }
  fi
done < <(printf 'a\nb\n\nc\n\nd\ne\nf\n\n')