Shell——read命令的使用


read命令使用的基本格式

read命令可以从标准输入中读取一行并将其拆分为字段

read命令读取单个变量

[wjj@learning ~]$ read name
zhang san
[wjj@learning ~]$ echo $name
zhang san

因为read命令是读取一行的内容,因此空格不会作为分隔符。

read命令还可以读取多个变量(变量中间用空格间隔)例如

[wjj@learning ~]$ read num num2 num3
111 222 333 
[wjj@learning ~]$ echo -e "${num}\n${num2}\n${num3}"
111
222
333

此外,read还有丰富的可添加选项,其格式:read [可添加选项] [变量名],例如:read -a arr。

可添加选项 说明
-a 把获取的数据赋给数组,数组下标从0开始
-d char 设置一个截至字符char,不会因换行和空格而终止,直到读取到char为止(不包括char)
-e 可以使用命令补全键
-i text 使用 text 作为阅读行的初始文本
-n num 设置一个读取字符数num,在读取 num个 字符后返回,而不是等待换行符,但如果在分隔符之前读取的字符少于 NCHARS 字符,则遵循分隔符
-N num 设置一个读取字符数num,在读取num个字符后返回,除非遇到 EOF 或读取超时,忽略任何分隔符(与n不同,N必须读够num个字符才会终止)
-p 在读取的时候打印指定字符串
-r 不允许转义字符\
-s 输入字符时不打印在终端上(光标也不会动)
-t time 设置一个截至时间time,time以秒为单位(超时不会获取任何字符)
-u fd 使用文件描述符 fd 作为输入源,而不是标准输入

示例

read选项示例

1)-a选项

把获取的数据赋给数组,数组下标从0开始。

[wjj@learning ~]$ read -a num
1 2 3 4     
[wjj@learning ~]$ echo -e "${num[0]}\t${num[1]}\t${num[2]}\t${num[3]}"
1	2	3	4

此时,num为一个数组,其中存储了1 2 3 4;shell只支持一维数组

2)-d选项

设置一个截至字符char,不会因换行和空格而终止,直到读取到char为止(不包括char)

[wjj@learning ~]$ read -d x name
zhang sanx
[wjj@learning ~]$ echo ${name}
zhang san

read读取到X时就会停止读取,并且读取内容包括X

3)-e选项

可以使用命令补全键

[wjj@learning ~]$ read -e file
           
.bash_history  .bash_logout   .bash_profile  .bashrc        study/         text.txt       .viminfo   

可以用过使用tab键查找当前路径下的文件,亦可以使用tab键对文件名称进行补全。

使用 text 作为阅读行的初始文本

4)-n选项

设置一个读取字符数num,在读取 num个 字符后返回,而不是等待换行符,但如果在分隔符之前读取的字符少于 NCHARS 字符,则遵循分隔符。

[wjj@learning ~]$ read -n 10 name
zhangsan
[wjj@learning ~]$ echo $name
zhangsan

设置了读取10个字符,但是读取了8个字符,通过换行符结束读取读取。

5)-N选项

设置一个读取字符数num,在读取num个字符后返回,除非遇到 EOF 或读取超时,忽略任何分隔符(与n不同,N必须读够num个字符才会终止)

[wjj@learning ~]$ read -N 10 name
zhangsan
a[wjj@learning ~]$ echo $name
zhangsan a

同样设置读取10个字符,但是换行符并不能终止读取,并且换行符被当作一个空格,直到读满10个字符终止。

6)-p选项

在读取的时候打印指定字符串。

[wjj@learning ~]$ read -p "输入用户名" name
输入用户名zhang san
[wjj@learning ~]$ echo $name
zhang san

7)-r选项

输入时不允许转义字符\\只当作普通字符。

[wjj@learning ~]$ read name
\!
[wjj@learning ~]$ echo $name
!
[wjj@learning ~]$ read -r name
\t
[wjj@learning ~]$ echo $name
\t

8)-s选项

输入字符时不打印在终端上(光标也不会动)。

[wjj@learning ~]$ read -s password
[wjj@learning ~]$ echo $password
12345

9)-t选项

设置一个截至时间time,time以秒为单位(超时不会获取任何字符)

#超时输入的情况,没有及时按enter
[wjj@learning ~]$ read -t 5 phone_num
123456[wjj@learning ~]$ 123456       #read没有读取字符,所以输入的字符跑到命令终端上了
[wjj@learning ~]$ echo $phone_num 

#打印不出来任何东西

#正常输入的情况
[wjj@learning ~]$ read -t 5 phone_num
12345
[wjj@learning ~]$ echo $phone_num 
12345

10)-u选项


read从文件中读取变量

首先,创建一个文件,里面存储三个人的姓名。

[wjj@learning ~]$ cat > test << "EOF"
> zhangsan
> lisi
> wangwu
> EOF

1)将while放在管道后面,实现逐行读取文件:

#!/bin/bash
count=0    #计数器
cat test | while read name  
do
   let count++
   echo "第${count}位:${name}"
done

2)只利用while进行循环读取:

#!/bin/bash
while read name
do
echo ${name} 
done < test

#也可以这样写,赋给多个变量
while read name1 name2 name3  
do
echo ${name1} ${name2} ${name3}
done < test

猜你喜欢

转载自blog.csdn.net/why1472587/article/details/128511736