read在while中的经常用法:
1 root@ubuntu:/var/lib/logrotate 10:53:05 118# cat /etc/cron.daily/logrotate 2 #!/bin/sh 3 4 # Clean non existent log file entries from status file 5 cd /var/lib/logrotate 6 test -e status || touch status 7 head -1 status > status.clean 8 sed 's/"//g' status | while read logfile date 9 do 10 [ -e "$logfile" ] && echo ""$logfile" $date" 11 done >> status.clean 12 mv status.clean status 13 14 test -x /usr/sbin/logrotate || exit 0 15 /usr/sbin/logrotate /etc/logrotate.conf 16 root@ubuntu:/var/lib/logrotate 10:53:19 119#
在上面中
每次调用read命令都会读取文件中的”一行”文本。当文件没有可读的行时,read命令将以非零状态退出。
通过什么样的方法将文件中的数据传给read呢?使用cat命令并通过管道将结果直接传送给包含read命令的while命令
但是当用:
1 root@ubuntu:/var/lib/logrotate 10:53:19 119# echo "aaa bbb" | read one two 2 root@ubuntu:/var/lib/logrotate 10:54:50 120# echo $one
one为空,
但是:
1 root@ubuntu:/var/lib/logrotate 10:56:11 124# echo "aaa bbb" | (read one two;echo -e "$one $two") 2 aaa 3 bbb
解释:
这里的问题在于read one是有管道产生的进程,而echo $one是外面的进程,两个one不是同一个变量,所以打印出来one没有数据
-a: 将输入的的文本放数组中,(默认已空格或者制表符分割),数组以下标0开始;
1 root@ubuntu:/home/dyx/linux 21:33:04 90# read -a name 2 nihao hhaha 3 root@ubuntu:/home/dyx/linux 21:57:45 91# echo ${name[*]} 4 nihao hhaha 5 root@ubuntu:/home/dyx/linux 21:57:57 92# echo ${name[1]} 6 hhaha
-d:指定结束符,当输入中出现指定的结束符时,read命令将认为输入已经结束(默认为换行);
-e:从标准输入读取中时,使用Readline库获取输入(此时用户可以使用退格键、方向箭头进行简单的行编辑操作);
-n:指定读入的字符数n;
-p:将该选项指定的字符串输出到标准错误,并读取输入;
-r:将读取到的字符串字段放到不同的变量中;
1 root@ubuntu:/home/dyx/linux 22:01:29 101# read -r v1 v2 v3 2 nifds fds fff 3 root@ubuntu:/home/dyx/linux 22:02:10 102# echo $v1 4 nifds
1 root@ubuntu:/home/dyx/linux 22:02:23 103# IFS="#";read -r v1 v2 v3 2 fdsfdsf fds #hshfhds#fdsf dsfs 3 root@ubuntu:/home/dyx/linux 22:05:11 104# echo $v1 4 fdsfdsf fds 5 root@ubuntu:/home/dyx/linux 22:05:17 105# echo $v2 6 hshfhds
最好有在修改IFS之前有,Old_IFS=$IFS, 之后再IFS=$Old_IFS
-s:先锁住屏幕,让后再从标准输入中读入字符;
-t:如果用户在指定的时间内没有输入,就结束读取状态;
-u:从指定的文件描述中读取。