看似简单的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简单的基础命令

相关推荐
草捏子2 小时前
从CPU原理看:为什么你的代码会让CPU"原地爆炸"?
后端·cpu
嘟嘟MD2 小时前
程序员副业 | 2025年3月复盘
后端·创业
胡图蛋.2 小时前
Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
java·spring boot·后端
无责任此方_修行中2 小时前
关于 Node.js 原生支持 TypeScript 的总结
后端·typescript·node.js
吃海鲜的骆驼3 小时前
SpringBoot详细教程(持续更新中...)
java·spring boot·后端
迷雾骑士3 小时前
SpringBoot中WebMvcConfigurer注册多个拦截器(addInterceptors)时的顺序问题(二)
java·spring boot·后端·interceptor
uhakadotcom4 小时前
Thrift2: HBase 多语言访问的利器
后端·面试·github
Asthenia04124 小时前
Java 类加载规则深度解析:从双亲委派到 JDBC 与 Tomcat 的突破
后端
方圆想当图灵4 小时前
从 Java 到 Go:面向对象的巨人与云原生的轻骑兵
后端·代码规范
Moment4 小时前
一份没有项目展示的简历,是怎样在面试里输掉的?开源项目或许是你的救命稻草 😭😭😭
前端·后端·面试