Linux命令(46)——read命令

1.命令简介

read命令是Shell内建命令,用于从标准输入或-u选项指定的文件描述符中读取单行,并将读取的单行根据IFS变量分割成多个字段,并将分割后的字段分别赋值给指定的变量列表var_name。第一个字段分配给第一个变量var_name1,第二个字段分配给第二个变量var_name2,依次到结束。如果指定的变量名少于字段数量,则多出的字段连同分隔符分配给最后一个var_name,如果指定的变量命令多于字段数量,则多出的变量赋值为空。如果没有指定任何var_name,则分割后的所有字段都存储在特定变量REPLY中。当然,其不仅可以赋值变量,还可以赋值数组。

IFS(Internal Field Separator)变量是Shell内建的环境变量,用于read命令将读取的单行分隔为多个字段。默认取值为。

REPLY变量也是Shell内建的环境变量,当read命令未指明接收变量时,用于接收read命令读取的单行内容。

2.命令格式

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

3.选项说明

-a [aname]:将分裂后的字段依次存储到指定的数组中,存储的起始位置从数组的下标0开始
-d [delim]:后跟一个标志符,只有第一个字符有用,用以取代换行符作为行的结束标志
-e:在输入的时候可以使用命令补全功能,使用Tab键可自动不全当前目录下文件
-i [text]:If readline is being used to read the line, text is placed into the editing buffer before editing begins
-n [nchars]:后跟一个数字,定义输入文本的长度,而不是读取整行
-N [nchars]:后跟一个数字,定义输入文本的长度,而不是读取整行。但是如果一行不足nchars个字符,则忽略行分隔符继续读取下一行
-p [prompt]:从终端读取输入时,在输入前打印提示信息
-r:屏蔽反斜杠\,如果没有该选项,则\作为一个转义字符,有的话\就是个正常的字符了
-s:安静模式,在输入字符时不再屏幕上显示,例如login时输入密码
-t [timeout]:后面跟秒数,定义输入字符的等待时间
-u [fd]:后面跟文件描述符fd,从文件描述符中读取

4.常用示例

(1)如果没有指定变量,read会把传入的值传给REPLY,只要调用REPLY,只要调用REPLY,只要调用REPLY就可以引用。

[root@TENCENT64 ~]# read;echo "\$REPLY:$REPLY"
dablelv
$REPLY:dablelv

(2)read从终端读取时指定一个提示语

[root@TENCENT64 ~]# read -p"input u password:";echo "\$REPLY:$REPLY"
input u password:123456
$REPLY:123456

(3)-t参数指定 read 命令等待输入的秒数,当计时满时,read命令返回一个非零退出状态码。

#!/bin/bash

if read -t 5 -p "输入网站名:" name
then
    echo "你输入的网站名是 $website"
else
    echo "\n抱歉,你输入超时了。"
fi
exit 0

执行程序不输入,等待5秒后:

输入网站名:
抱歉,你输入超时了

(4)除了控制输入时间,还可以使用-n选项控制输入的字符数量。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。例如只接收2个输入就退出:

#!/bin/bash

read -n2 -p "请随便输入两个字符: " any
echo "\n您输入的两个字符是:$any"
exit 0

(5)-s选项能够使输入的数据不显示在命令终端上(实际上,输入的内容是显示的,只是read命令将文本颜色设置成与背景相同的颜色)。输入密码常用这个选项。

#!/bin/bash

read  -s  -p "请输入您的密码:" pass
echo "\n您输入的密码是 $pass"
exit 0

执行程序输入密码后是不显示的:

请输入您的密码:
您输入的密码是 runoob

(6)读取文件 每次调用 read 命令都会读取文件中的 “一行” 文本。当文件没有可读的行时,read 命令将以非零状态退出。

while read var1 var2
do
	echo $var1 $var2
done < file.txt

参考文献

[1]man read [2]man bash [3]read指令使用方法 [4]详细解析Shell中的IFS变量 [5]菜鸟教程.Linux read 命令

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上

ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model类型及其属性上的ValidationAttribute才有效。如果我们能...

22380
来自专栏xingoo, 一个梦想做发明家的程序员

《vi和vim》 学习手记(2)

:set wm=10 设置与右边界的距离。右边界为10个字符。 o 移到一行的开头 s 移到一行的结尾 w 移到下一个单词的 b 退后一个单词 S 更改一行文本...

19680
来自专栏Java技术分享

Redis实现信息已读未读状态提示

前提: 假如现在有2个模块需要提示消息:只要存在用户在上个时间点之后没有看过的信息就提示用户有新的信息 思路如下: 使用hash存储用户上次看过的时间,使用so...

88860
来自专栏Python研发

大话设计模式之简单工厂模式

  最近朋友推荐了一本书《大话设计模式》,此书刚刚到,博主也还没开始看,希望以博文的方式与大家一起分享,一起学习.

13530
来自专栏python3

python之linux下pdb试调

break : 添加断点,比如在第5行添加断点break 5,在getlist函数添加断点break

9620
来自专栏北京马哥教育

五个python常用运维脚本面试题实例

一、用Python写一个列举当前目录以及所有子目录下的文件,并打印出绝对路径 #!/usr/bin/env python import os for root,...

60670
来自专栏蓝天

awk给外部变量赋值

假设将值存在文件t中,文件t内容如下,只有一行:a b c 需要将a、b和c分别赋给外部变量x、y和z,则脚本可写成如下: eval $(awk '{ pr...

9630
来自专栏生信小驿站

R语言基础操作①基础指令

q()——退出R程序 tab——自动补全 ctrl+L——清空console ESC——中断当前计算

45320
来自专栏磨磨谈

CephFS: No space left on device

这是一篇旧闻,由于用cephfs的人还不是很多,所以比较少发关于cephfs相关的东西,最近看到有人开始使用,并且遇到了问题,这个就是其中一个比较容易出的问题,...

30450
来自专栏性能与架构

JS this指针的理解

this是javascript的一个关键字,也是比较容易令人迷糊的一个概念 this的本质:当前对象的所有者 示例1 var x = 1; function t...

40970

扫码关注云+社区

领取腾讯云代金券