arrays - 从 NUL 分隔输入填充 bash 数组

标签 arrays bash stdin nul

我想从 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/

相关文章:

java - 在 java 中读取 char 数组时遇到问题。我究竟做错了什么?

Python 未在 GitBash 上运行

bash - 使用 throttle 将文件通过管道传输到标准输入

java - 如何将字节数组转换为文件

c++ - 一维或三维数组?

c - 如何在 C 中通过引用来引用二维字符数组

linux - 将输出存储到变量 bash

mysql - 如果不存在则创建表挂起

java - 将 matlab 输入 (stdin) 连接到 java

c++ - 测试标准输入是否有 C++ 输入(windows 和/或 linux)