从NUL分离的输入中填充bash数组

vaa*_*aab 2 arrays bash stdin nul

我想从NUL分离的输入(来自stdin)创建一个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
Run Code Online (Sandbox Code Playgroud)

所以这是我的意见.

现在,如果不使用-aof 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 
Run Code Online (Sandbox Code Playgroud)

我们得到了正确的价值观.但我无法使用-a以下方法存储这些值:

$ read -r -d '' -a arr < <(echo -en "A B\0C\nD\0E\0")
$ declare -p arr
declare -a arr='([0]="A" [1]="B")'
Run Code Online (Sandbox Code Playgroud)

这显然不是我想要的.我想拥有:

$ declare -p arr
declare -a arr='([0]="A B" [1]="C
D" [2]="E")'
Run Code Online (Sandbox Code Playgroud)

有没有办法read -a,如果它不起作用,为什么?你知道一个简单的方法(避免while循环)吗?

Cha*_*ffy 6

read -a正如你所注意到的那样,这是工作的错误工具; 它只支持非NUL分隔符.在BashFAQ#1中给出了适当的技术:

arr=()
while IFS= read -r -d '' entry; do
  arr+=( "$entry" )
done
Run Code Online (Sandbox Code Playgroud)

就错误工具的原因 而言read -d '' -a:-d给出read一个参数来确定何时完全停止读取,而不是何时停止读取单个元素.

考虑:

while IFS=$'\t' read -d $'\n' words; do
  ...
done
Run Code Online (Sandbox Code Playgroud)

...这将读取由制表符分隔的单词,直到它到达换行符.因此,即使使用read -a,-d ''将使用将读取,直到达到NUL.

你想要什么,阅读直到没有更多的内容可用并被NUL分割,不是NUL的'-d',而是根本没有行尾字符(而且是空的IFS).这不是read目前可用的东西.