7

我一直在阅读这篇文章:bash "for in" looping on null delimited string variable 以查看我是否能够处理包含数组内空格的任意文本。

根据上面的帖子,这很好用:

while IFS= read -r -d '' myvar; do echo $myvar; done < <(find . -type f -print0)

为了检查我的理解,我也这样做了(仍然可以正常工作):

while IFS= read -r -d '' myvar; do echo $myvar; done < <(printf "%s\0" 'a b' 'c d')

但是,然后我尝试将输出存储在一个数组中,它出错了:

IFS= read -r -d '' -a myvar < <(printf "%s\0" 'a b' 'c d')

该数组仅包含a b而不包含c d

echo ${myvar[@]}
a b

显然,我在这里遗漏了一个更精细的细节。谢谢你的帮助。

PS。我在跑步:

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14)
Copyright (C) 2007 Free Software Foundation, Inc.
4

1 回答 1

12

bash4.4 中,该readarray命令获得了一个-d选项,类似于read.

$ IFS= readarray -d '' myvar < <(printf "%s\0" 'a b' 'c d')
$ printf "%s\n" "${myvar[@]}"
a b
c d

如果您必须支持早期版本,则需要显式循环输出。

while IFS= read -d '' line; do
    myvar+=( "$line" )
done < <(printf "%s\0" 'a b' 'c d')
于 2016-01-01T14:34:46.397 回答