请问这段Shell脚本的含义?

今天接触inotify时在网上看到一段脚本,如下:

inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f'
-e create,delete,modify,attrib  $SRCDIR | while read DATE TIME DIR FILE; do
   $FILECHANGE=${DIR}${FILE}
   rsync -avze 'ssh' $SRCDIR root@${DESTHOST}:${DESTHOSTDIR} &>/dev/null && \
      echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/filesync.log

done

其中的 管道后面的 read DATE TIME DIR FILE 是什么意思?而且在下文中又可以通过 变量的形式获得到 ${DATE},另外一个例子差不多,如下:

   xxx | while read D E F

请前辈指点下,谢谢!

阅读 5.4k
2 个回答

简单的来说,inotifywait检测文件变动,输出结果是类似,
25/3/2015 15:20 /home/user example.txt

每行执行一次竖线|(也叫管道)后面的read,
read的作用是read后面的变量分别匹配这四个结果,按空格分隔,
然后四个值或者说四个字符串分别存入read后面的四个参数作为变量循环下去。
就是说,下文里面的${DATE}就是2015三月二十五,$TIME就是15:20,$DIR就是。。然后。。就是。。
${DATE}也可以写成$DATE。
至于写成D E F也可以,只不过是个变量名,写成这样比较容易理解,只要个数相同就可以,下文也改了也是可以,例如这里read D E F G,D就是日期,E是时间,F是目录,G是文件名,下文里面rsync用到这里的地方对应的改过来就行了。

read DATE TIME DIR FILE
通过用户键盘将输入的内容赋值给 日期 时间 目录 文件 这些变量,输入格式就是4个变量中间用空格隔开

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题