用-N1参数读取bash脚本中的命令

用-N1参数读取bash脚本中的命令,bash,Bash,为什么这个脚本在read命令之后需要-rN1(特别是N1)?为什么我们只想传递1个字符 counter=0 while IFS= read -rN1 _; do ((counter++)) done < <(find /etc -printf ' ') echo "$counter files" 计数器=0 当IFS=读取-rN1时;做 ((计数器++)) done

为什么这个脚本在read命令之后需要-rN1(特别是N1)?为什么我们只想传递1个字符

counter=0

while IFS= read -rN1 _; do
    ((counter++))
done < <(find /etc -printf ' ')

echo "$counter files"
计数器=0
当IFS=读取-rN1时;做
((计数器++))

done<
-N1
在从输入读取单个字符或达到EOF后返回。不使用交货机。在这里键入
help read
read可能会有所帮助

整个脚本对文件夹中的文件进行递归计数,并为找到的每个文件打印一个空格<代码>读取
读取每个空格并递增计数器

可以使用
wc-c
更简单地编写命令:

counter=$(find /etc -printf ' ' | wc -c)
echo "$counter files"
。。。甚至没有
wc

counter=$(find /etc -printf ' ')
echo "${#counter} files"

感谢
帮助阅读中的@gniourf\u gniourf

这告诉read在读取一个字符后返回

每次读取一个字符时,
计数器
递增。因此,这有效地统计了子树
/etc
中的文件数



在这个设计中(这是一个糟糕的设计,请参阅的答案以获得更好的策略),
find
为找到的每个文件吐出一个空间。找到的每个文件只有一个空格(没有换行符等)。因此,您希望
read
一次只读取一个字符,这样
计数器可以每次递增。

为此,我们需要知道它应该做什么。或者不使用
wc
xs=$(find/etc-printf'x');回显“${xs}文件”
。我喜欢这个方法,因为有了它,你可以做如下事情:
ts=$(find/etc-typef-printf'f'-o-typed-printf'd'-o-printf'o');fs=${ts//[^f]}ds=${ts//[^d]}os=${ts//[^o]};printf“%d个文件,%d个目录,%d个其他\n'${fs}”“${ds}”“${os}”
只需一次
find
运行。@gniourf\u gniourf是的,很好!)我读了手册页,但我不明白为什么我们只想读一个字符。有什么优势吗?@William优势胜过什么?如果一次不读一个字,你怎么写呢?如果在没有
-N1
的情况下运行该循环,则不会得到正确的结果。感谢您的快速回复。这样我才能更好地理解移除N1后会发生什么?我想一个空字符会在没有N1的情况下分隔这个计数器和递增计数器。我想我的问题问得不好。很抱歉只读一个字符有什么好处?(现在想一想,这样会更快吗?)find为找到的每个文件吐出一个空格。为找到的每个文件只吐出一个空格(没有换行符等)!我现在明白了!!
-N nchars return only after reading exactly NCHARS characters, unless
      EOF is encountered or read times out, ignoring any delimiter