【发布时间】:2014-06-21 20:30:54
【问题描述】:
我想从 NUL 分隔的输入(来自标准输入)创建一个 bash 数组。
这是一个例子:
## Let define this for clarity
$ hd() { hexdump -v -e '/1 "%02X "'; echo ;}
$ echo -en "A B\0C\nD\0E\0" | hd
41 20 42 00 43 0A 44 00 45 00
这是我的意见。
现在,如果不使用 -a 的 read 命令,使用 NUL 可以正常工作:
$ while read -r -d '' v; do echo -n "$v" | hd; done < <(echo -en "A B\0C\nD\0E\0")
41 20 42
43 0A 44
45
我们得到正确的值。但我无法使用-a 存储这些值:
$ read -r -d '' -a arr < <(echo -en "A B\0C\nD\0E\0")
$ declare -p arr
declare -a arr='([0]="A" [1]="B")'
这显然不是我想要的。我想要:
$ declare -p arr
declare -a arr='([0]="A B" [1]="C
D" [2]="E")'
有没有办法使用read -a,如果它不起作用,为什么?你知道一个简单的方法来做到这一点(避免while 循环)?
【问题讨论】:
-
为什么要避免while循环? while 循环是常见问题解答批准的 irc.freenode.org/#bash-blessed 正确方法。
-
...请注意,我更喜欢
readarray或mapfile支持 NUL 分隔符,但从 Bash 4.3 开始,它们不支持。也许有人应该问切特是否会接受补丁...... -
我正在使用
while循环。我只是想知道为什么这不起作用,并且不想确保我没有遗漏一些明显的东西。任何可以提供有关“为什么”的更多信息的详细信息(错误报告、源代码链接、操作系统限制、来源确认)? -
-d提供了read -a使用的分隔符来告诉它何时完全停止阅读,而不是何时停止阅读单个条目。这会让行为更清晰吗?