linux中read用法

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:从指定的文件描述中读取。

原文地址:https://www.cnblogs.com/yi-meng/p/3204384.html