我想从 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
这是我的意见。
现在,如果不使用 read
命令的 -a
,使用 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
循环)吗?
最佳答案
正如您所注意到的,
read -a
是不适合这项工作的工具;它只支持非 NUL 分隔符。 BashFAQ #1 中给出了适当的技术:
arr=()
while IFS= read -r -d '' entry; do
arr+=( "$entry" )
done
为什么 read -d '' -a
是错误的工具:-d
给出了 read
用于确定何时完全停止阅读而不是何时停止阅读单个元素的参数。
考虑:
while IFS=$'\t' read -d $'\n' words; do
...
done
...这将读取由制表符分隔的单词,直到到达换行符。因此,即使使用 read -a
,使用 -d ''
也会读取 直到它达到 NUL。
你想要的是阅读直到没有更多内容可用并被 NUL 分割,这不是 NUL 的“-d”,而是根本没有行尾字符(和一个空的 IFS
)。这不是 read
的用法当前可用的内容。
关于arrays - 从 NUL 分隔输入填充 bash 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23474166/