根据手册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
分裂机制。