为什么即使使用 -N 标志,“read”也会去除空格?

为什么即使使用 -N 标志,“read”也会去除空格?

根据手册read(因为它是内置的,所以不是man read,而是help read):

-N nchars仅在精确读取 NCHARS 字符后返回,除非遇到 EOF 或读取超时,忽略任何分隔符

然而,即使-N使用了该标志,read似乎仍然想从输入数据中删除分隔符。以下面的数据为例:

# readfail.sh - Reads 5 characters at a time, and adds "RegEx style" start and end characters for clarity
while read -r -N 5 data; do
    echo "^${data}\$"
done;

echo "^${data}\$"  # There will be data left over just because of the way `read` uses exit codes

这是输出:

$ echo -n "Lorem ipsum dolor sit amet" | ./readfail.sh
^Lorem$
^ipsu$
^m dol$
^or si$
^t ame$
^t$

请注意,第二行只有 4 个字符长。这是因为Lorem和之间应该有一个空格ipsum,导致以下五个字符的输出:^ ipsu$

我可以通过IFS=在循环之前设置来解决这个问题,但是,不read应该是忽略由于-N标志而有任何分隔符吗?这是一个错误,还是有意的行为?

答案1

-N导致行尾分隔符被忽略。 Bash 会准确读取指定数量的字符,无论这些字符是什么。这与已读取的内容以可变内容的形式报告给脚本的方式无关。这使用了通常的IFS分裂机制。

相关内容