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

时间:2015-02-27 14:13:21

标签: bash

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

counter=0

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

echo "$counter files"

2 个答案:

答案 0 :(得分:2)

从输入读取单个字符后,如果达到EOF,则返回

-N1。没有使用分隔符。输入help read读取将在此处帮助

整个脚本以递归方式计算文件夹中的文件,并为找到的每个文件打印一个空格。 read读取每个空格并递增计数器。

使用wc -c

可以更简单地编写命令
counter=$(find /etc -printf ' ' | wc -c)
echo "$counter files"

......甚至没有wc

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

感谢@gniourf_gniourf

答案 1 :(得分:1)

来自help read

-N nchars return only after reading exactly NCHARS characters, unless
      EOF is encountered or read times out, ignoring any delimiter

因此,这会在读取一个字符后告诉read返回。

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


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