看似简单的read命令-->shell中最重要的输入命令!

read命令是干什么的?

read命令,是shell不可或缺 的一个输入命令 ,它的用途相当于c++中的cin输入流的用途,同时他也是shell中的内核命令通过read命令及其附带的一系列选项,我们可以很轻松的读取用户在键盘上的输入

read命令的写法

如果你想用read命令读取用于在键盘上的输入,那么read命令就应该这样写:

bash 复制代码
read [选项] [变量]

如果你执行没有任何选项的read命令,但是有变量,那么,命令不会结束,因为光标一直停在空行上,要你输出一些东西之后按回车才能结束。如果你按了回车,那么变量就读取了你在键盘上输入的东西,此时echo一下这个变量,就跟你刚才输入的东西一模一样了。

而如果你的read命令既没有选项,也没有变量,那么,在读取你的键盘的输入之后,REPLY变量就会读取你在键盘上的输入,此时你再echo一下REPLY变量,就也会输出你刚才在键盘上输入的东西。

read命令的选项

现在,就要来点有选项的read命令了,read命令的选项,主要就是以下几种。

选项 用途
-d 结束输入的字符串 设置用户结束输入的标识符,标识符为结束输入的字符串的第1个字符
-n 输入字符的最大数 限制用户在键盘上输入的字符的最大数
-N 输入字符数 限制用户在键盘上必须输入的字符数
-p 提示信息 在用户输入之前输出该提示信息
-r 原样读取用户的输入,无转义
-s 静默模式,输入时不显示用户输入的内容,适合密码的输入
-t 设定用户输入的时间,单位为秒,如果超出这个时间,会自动退出,变量将不被读取,返回非0数

其中,我要深度介绍的,主要是选项-n-p-s-t

选项-n

选项-n,用于限制用户在键盘上输入的字符的最大数。举个例儿,如果你想要在系统里读取用户是男还是女,那么,命令就可以这样写:

bash 复制代码
read -n 1 gender
echo $gender

之后,就可以通过gender字符串来获取用户的性别。但是在脚本中,就不同了,你如果在脚本中写这条read命令的话,并且你是用sh来执行它的,那么这条命令大概率就会报错。

因此,我这里有一个方法,不用花太多时间,可以让你的read命令的-n参数起死回生,既然在用sh来执行它的时候会报错,那么我们用bash来执行或者直接调用该脚本就不报错了 。而read-n选项也就看5秒广告复活了。

而如果你觉得用bash执行很不舒服,那么,可以在.bashrc文件里新添上这样一行脚本:alias = sh='bash',因为别名比命令更被优先执行 ,所以照这样,你就可以通过用sh来执行脚本,而使-n选项又加了1命。

选项-p

选项-p,就是在输入前先输出些东西,还是以刚才的例子举例,现在如果你想要让用户知道要输什么,那么就要在read命令的前面添加echo提示用户,当然,再简单一点,还可以用选项-p来提示用户要输什么,就如下。

bash 复制代码
read -p '你是男是女? -- ' -n 1 gender

选项-s

选项-s,就是在用户输入的过程中不显示用户输入的内容,换个例子,假设你的脚本有密码系统,那么确保用户的安全性,如果此时的用户在输入密码的时候显示了密码,密码就容易被别人偷窥,从而让什么人都能霍霍你的电脑。

为了进一步增强用户的安全性,在输入密码的时候,密码要隐藏,想要让密码隐藏,此时-s选项就是你特别的帮助

为了确保用上-s选项后用户真的看不到他自己输入的内容,我们就用read -s来测试一下。

可以看到,用户输入的内容被隐藏掉了。

因此,-s选项适用于密码的输入。像这样的例子,其实还有很多,比如mysql的密码输入;linux系统不以root登录用户时的密码输入,这些全都用到了-s的选项,并且都十分的好用。

选项-t

选项-t,则是一个限制用户输入时间的选项,单位为秒 ,可以让用户在输入的时候不会花太多的时间,回顾刚才的例子,现在的密码系统单是用了-s参数还不够,还要让用户只能在20秒内输入密码,这时,-t这个选项就有用了。

由于要让用户只能在20秒内输入密码,所以选项-t后面的参数就为20,为了看看-t选项的作用,我们执行一下read -t 1

这条命令执行一会就退出了,说明-t选项的作用也生效了。

至于检测-t选项是否超时,只需要输出$?看就行。

下篇预告

实用的alias别名命令------比2=1+1简单的基础命令

相关推荐
一颗知足的心7 分钟前
Go语言之路————指针、结构体、方法
开发语言·后端·golang
Rabbb2 小时前
C# JSON属性排序、比较 Newtonsoft.Json
后端
蓝易云2 小时前
在Linux、CentOS7中设置shell脚本开机自启动服务
前端·后端·centos
一千柯橘2 小时前
Nestjs 解决 request entity too large
javascript·后端
userkang2 小时前
消失的前后端,崛起的智能体
前端·人工智能·后端·ai·硬件工程
慧一居士3 小时前
Kafka HA集群配置搭建与SpringBoot使用示例总结
spring boot·后端·kafka
@_猿来如此3 小时前
Django 实现电影推荐系统:从搭建到功能完善(附源码)
数据库·后端·python·django
言之。3 小时前
【Go语言】ORM(对象关系映射)库
开发语言·后端·golang
极客智谷4 小时前
深入理解Java线程池:从原理到实战的完整指南
java·后端
我的耳机没电了4 小时前
mySpace项目遇到的问题
后端