在换行符上分割字符串并使用 read 将其写入数组

6 bash array string

给定 string foo,我想将它的每个字段存储\n到 array 的元素中bar。我想使用read命令或与旧版本的 bash 兼容的任何其他命令(但readarray不是)来执行此操作。

我尝试了这个命令:

IFS=$'\n' read -d '' -r -a bar <<< "$foo"
Run Code Online (Sandbox Code Playgroud)

但它只返回错误代码 1。

有什么命令可以用来完成我想要的事情吗?我知道我可以迭代地执行此操作,但显然仅使用一个命令执行此操作是首选。

gle*_*man 4

read返回 1,因为在字符串中看不到分隔符。但是,该数组已填充:

$ echo "$BASH_VERSION"
3.2.57(1)-release
$ foo=$'one\ntwo\nthree\nfour'

$ IFS=$'\n' read -d '' -r -a bar <<<"$foo"
$ echo $?
1
$ declare -p bar
declare -a bar='([0]="one" [1]="two" [2]="three" [3]="four")'
Run Code Online (Sandbox Code Playgroud)

使用非空分隔符会产生非零结果:

$ unset bar
$ IFS=$'\n' read -d "\034" -r -a bar <<<"${foo}\034"
$ echo $?
0
$ declare -p bar
declare -a bar='([0]="one" [1]="two" [2]="three" [3]="four")'
Run Code Online (Sandbox Code Playgroud)

八进制 34 是 ASCII“文件分隔符”字符,不太可能出现在您的数据中。