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
  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是元笙阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值