如何在Linux中使用read命令读取用户输入?——read命令实战

news2024/11/16 17:31:19

前言

大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第64篇文章。

专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望对你有用。

今天我们一起来看看read命令的使用

🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,双一流院校计算机专业😉😉
💕 座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步🍺🍺🍺
💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘

文章目录

  • 前言
  • 一. read命令介绍
  • 二. 语法格式及常用选项
  • 三. 参考案例
    • 3.1 读取单个或者多个变量
    • 3.2 read -a 读取的数据存入数组中
    • 3.3 read -n/N 读取n个字符
    • 3.4 read -p 提示信息
    • 3.5 read -s 密码不会在终端输出,更安全
    • 3.6 read -r
    • 3.7 read -i 用于给变量一个默认值
    • 3.8 read -t 设定用户的超时时间
    • 3.9 read -k 用于读取指定数量的键盘输入内容
  • 总结

一. read命令介绍

在 Linux 中,read 是一个 Bash shell 内置命令,用于从标准输入或文件描述符中读取一行或多行输入,并将其保存到一个或多个变量中。

二. 语法格式及常用选项

依据惯例,我们还是先查看帮助,使用 help read

[root@mufeng164 ~]# help read
read: read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-N 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [名称 ...]
    从标准输入读取一行并将其分为不同的域。
    
    从标准输入读取单独的一行,或者如果使用了 -u 选项,从文件描
    述 FD 中读取。该行被分割成域,如同词语分割一样,并且
    第一个词被赋值给第一个 NAME 变量,第二个词被赋值给第二个
    NAME 变量,如此继续,直到剩下所有的词被赋值给最后一个
    NAME 变量。只有 $IFS 变量中的字符被认作是词语分隔符。
    
    如果没有提供 NAME 变量,则读取的行被存放在 REPLY 变量中。
    
    选项:
      -a array	将词语赋值给 ARRAY 数组变量的序列下标成员,从
    		零开始。
      -d delim	持续读取直到读入 DELIM 变量中的第一个字符,而不是
    		换行符
      -e		在一个交互式 shell 中使用 readline 获取行
      -i text	使用 TEXT 文本作为 readline 的初始文字
      -n nchars	读取 nchars 个字符之后返回,而不是等到读取
    		换行符,但是分隔符仍然有效,如果遇到分隔符之前读
    		取了不足 nchars 个字符
      -N nchars	在准确读取了 nchars 个字符之后返回,除非遇到
    		了文件结束符或者读超时,任何的分隔符都被忽略
      -p prompt	在尝试读取之前输出 PROMPT 提示符并且不带
    		换行符
      -r		不允许反斜杠转义任何字符
      -s		不显示终端的任何输入
      -t timeout	如果在 TIMEOUT 秒内没有读取一个完整的行则
    		超时并且返回失败。TMOUT 变量的值是默认的超时时间。
    		TIMEOUT 可以是小数。如果 TIMEOUT 是0,那么仅当在
    		指定的文件描述符上输入有效的时候,read 才返回成功。
    		如果超过了超时时间,则返回状态码大于128
      -u fd		从文件描述符 FD 中读取,而不是标准输入
    
    退出状态:
    返回码为零,除非遇到了文件结束符,读超时,或者无效的文
    件描述符作为参数传递给了 -u 选项。
readarray: readarray [-n 计数] [-O 起始序号] [-s 计数] [-t] [-u fd] [-C 回调] [-c 量子] [数组]
    从一个文件中读取行到数组变量中
    
    一个 `mapfile'的同义词。
readonly: readonly [-aAf] [name[=value] ...] or readonly -p
    标记 shell 变量为不可改变。
    
    标记每一个 NAME 名称为只读;这些 NAME 变量的值将不可以被后续的赋值
    操作所改变。如果提供了 VALUE,则在标记为只读之前将 VALUE 值赋给变量。
    
    选项:
      -a	指下标数组变量
      -A	指关联数组标量
      -f	指 shell 函数
      -p	显示只读变量和函数列表
    
    `--' 的参数禁用进一步的选项处理。
    
    退出状态:
    返回成功,除非使用了无效的选项或者 NAME 名称。

为了更直观一些,我们把常用的参数用表格来展示:

参数描述
-r告诉 Bash 不要将反斜杠字符看作转义符号。
-p“提示信息”:指定提示信息,等待输入。
-s从标准输入中读取密码而不在屏幕上显示输入的字符。
-t“超时时间”:设置读取输入的超时时间(以秒为单位)。
-n 1读取一个字符,而不是整行输入。
-a读取的内容存入数组

有了具体的参数之后,我们再来看实战案例:

三. 参考案例

如果你不是在csdn看到这篇文章,那多半内容不全,建议到csdn搜索:我是沐风晓月,查看全部文章。

3.1 读取单个或者多个变量

[root@mufeng164 ~]# read a
12
[root@mufeng164 ~]# echo $a
12
[root@mufeng164 ~]# read a b c 
12 33 44
[root@mufeng164 ~]# echo $a $b $c
12 33 44

3.2 read -a 读取的数据存入数组中

[root@mufeng164 ~]# read -a array
this is test  i  am mufeng  i am 20 years old
[root@mufeng164 ~]# echo ${array[@]}
this is test i am mufeng i am 20 years old
[root@mufeng164 ~]# echo ${array[0]}
this
[root@mufeng164 ~]# echo ${array[1]}
is

如果你不是在csdn看到这篇文章,那多半内容不全,建议到csdn搜索:我是沐风晓月,查看全部文章。

3.3 read -n/N 读取n个字符

read -n 用于从标准输入读取指定长度的字符或字节数,而不是读取整行输入。使用 -n 选项时,read 命令会等待用户输入指定长度的字符,然后将其赋值给变量并退出。

[root@mufeng164 ~]# cat a.sh 
#!/bin/bash

# 读取一个单个字符的输入
read -n 1 -p "请输入 'y' 或 'n': " answer
echo    # 换行

# 根据用户的输入做出相应的反应
if [[ $answer = y ]]; then
    echo "用户输入了 'y'。"
elif [[ $answer = n ]]; then
    echo "用户输入了 'n'。" 
else
    echo "用户输入有误。"
fi

这个时候用户输入多个字符,默认之取第一个字符。

小技巧:在没有-n选项的情况下,输入空格键是无效的,但使用了-n选项后,空格键等非控制字符也能被读取,因此在对这类用户输入进行处理时注意处理不需要的空格或特殊字符。

3.4 read -p 提示信息

read -p 选项用于在等待用户输入之前向用户显示一个提示信息,prompt中可以包含任何字符串。使用 -p 选项时,用户输入的内容将自动保存到变量中,并可以在后续处理过程中使用。

#!/bin/bash

# 提示用户输入姓名
read -p "请输入您的姓名: " name

# 根据用户的输入作出响应
echo "您好,$name!欢迎访问我们的网站。"

3.5 read -s 密码不会在终端输出,更安全

read -s 选项用于从标准输入读取一个密码,而不在终端上显示输入的字符。使用 -s 选项时,用户输入的内容将自动保存到变量中,并可以在后续处理过程中使用。

#!/bin/bash

# 提示用户输入密码
read -s -p "请输入您的密码: " password
echo

# 根据用户的输入作出响应
echo "您输入的密码是: $password"

3.6 read -r

read -r 选项用于告诉 Bash 不要将反斜杠字符视为转义字符。如果不使用 -r 选项,则 read 命令会将以反斜杠开头的字符(例如 \n 或 \t)视为转义字符,并将其转换为相应的字符。

使用了 -r 选项来读取带有转义符的输入,例如 \n 或 \t。如果不使用 -r 选项,则 read 命令会将这些反斜杠字符视为转义字符,并将其转换为相应的字符。

小技巧:使用 -r 选项通常是一个好习惯,这样可以避免 Bash 将输入的反斜杠字符视为转义字符并将其转换为其他字符。

#!/bin/bash

# 读取一个带有转义符的输入
read -r -p "请输入带有转义符的字符串: " str

# 显示用户输入的字符串
echo "您输入的字符串是: $str"

执行结果:

root@mufeng164 ~]# ./c.sh 
请输入带有转义符的字符串: \ta    
您输入的字符串是: \ta

3.7 read -i 用于给变量一个默认值

read -i 选项用于给 read 命令提供一个默认值。如果用户没有输入任何内容,那么默认值将被用作变量的值。如果用户输入了内容,那么用户的输入将覆盖默认值。

#!/bin/bash

# 提示用户输入年份,如果用户不输入则使用默认值
read -i 2022 -p "请输入当前所处的年份(默认为2022): " year

# 根据用户的输入做出反应
echo "当前年份是: $year"

在上面的示例中,使用 -i 选项提供了一个默认值,即用户未输入任何内容时年份为 2022 年。如果用户输入了其他年份,那么输入的年份将覆盖默认值。

注意,如果用户直接敲击回车键,那么默认值将被视为用户的输

3.8 read -t 设定用户的超时时间

#!/bin/bash

# 提示用户输入文件路径,并在5秒内等待输入
read -t 5 -p "请输入文件路径: " file_path

# 根据用户的输入做出响应
if [[ -n "$file_path" ]]; then
  echo "正在处理文件:$file_path ..."
else
  echo "没有输入文件路径,程序退出。"
fi

3.9 read -k 用于读取指定数量的键盘输入内容

比如可以用在验证码的场景:如果输入的字符数不足指定长度,read 命令将一直等待直到输入完成。

#!/bin/bash

# 读取一个定长的验证码
read -k 6 -p "请输入6位验证码: " code

# 显示用户输入的验证码
echo "你输入的验证码是: $code"

一般在验证场景,我们可以生成一个随机验证码:

code=$(openssl rand -hex 3)

如果你不是在csdn看到这篇文章,那多半内容不全,建议到csdn搜索:我是沐风晓月,查看全部文章。

总结

💕💕💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!✨ ✨ ✨
🍻🍻🍻如果你喜欢的话,就不要吝惜你的一键三连了~

请添加图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现jvm内存溢出

那么我们如何来构建一个堆内存溢出呢?其实很简单,我们只要定义一个List对象,然后通过一个循环不停的往List里面塞对象。因为只要Controller不被回收,那么它里面的成员变量也是不会被回收的。这样就会导致List里面的对象越来越多&a…

Play wright自动化测试工具该如何更加完美地使用

目录 1.1 拦截网络请求 1.2 pytest 管理用例 1.3 PO模型 1.4 API 和 UI 自动化测试融合 1.5 数据驱动 1.6 动态挑选用例执行 1.6 Allure测试报告 1.7 持续集成 1.1 拦截网络请求 网络拦截: 无响应 pass 中止 route.abort("aborted") 放行 route…

Hazel游戏引擎(013)Layers游戏的层级

文中若有代码、术语等错误,欢迎指正 文章目录 前言增加Layer后的主要类图项目相关代码项目流程效果 LayerStack类的错误 前言 此节目的 为完成008事件系统设计的第四步,将事件从Application传递分发给Layer层。 使引擎事件系统模块完整 Layer的理解 …

在VSCode下利用PlateFormIO开发Arduino的MicroROS遇到的一些问题

简介 我是按照鱼香ROS的教程【3.搭建PlateFormIO开发环境】进行的,但是在进行的过程中,遇到了一些问题,这里记录下来,供有同样问题的同学进行参考。其实只要你使用的板子的MCU是ESP32,都可以按照他这个教程进行操作。…

k8s实践之mysql集群搭建(十五)

先下载 k8s实践之mysql集群搭建资料 主从模式简介: 当master主服务器上的数据发生改变时,则将其改变写入二进制(binlog)事件日志文件中; slave从服务器会在一定时间间隔内对master主服务器上的二进制日志进行探测&am…

掌握Vue生命周期,让你的前端开发效率翻倍!

1 Vue实例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue实例</title><script src../vue.js></script> </head> <body><div id"root"><!-- v…

位图以及布隆过滤器

本文主要讲解哈希思想的实际应用&#xff0c;位图和布隆过滤器。 位图 讲解位图之前我们先来解答这样一道腾讯的面试题 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。【腾讯】 很多人立马就想到了用…

Seata TCC 模式理论学习、生产级使用示例搭建及注意事项 | Spring Cloud55

一、前言 通过以下系列章节&#xff1a; docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…

STL——set容器、map容器

初识STL **set容器/multiset容器****set容器——构造和赋值****set容器——大小和交换****set容器——插入和删除****set容器的查找和统计****set和multiset的区别****set的相关操作源码&#xff1a;****multiset的相关操作源码** **pair使用——pair队组的创建****set容器——…

FreeRTOS-定时器详解

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转FreeRTOS &#x1f4ac;保持…

2023全国计算机二级考试时间(全年各阶段考试时间安排)

2023全国计算机二级考试时间(全年各阶段考试时间安排) 2023年全国计算机二级考试时间分别为&#xff1a;3月25日至27日(上半年3月)、9月23日至25日(下半年9月)。 其中3月和9月开考全部级别全部科目&#xff0c;5月和12月考试开考一、二级全部科目&#xff0c;各省级承办机构可根…

RabbitMQ集群部署之镜像模式

RabbitMQ集群的普通模式中&#xff0c;一旦创建队列的主机宕机&#xff0c;队列就会不可用。不具备高可用能力。如果要解决这个问题&#xff0c;必须使用官方提供的镜像集群方案。 官方文档地址&#xff1a;https://www.rabbitmq.com/ha.html 1.镜像模式的特征 默认情况下&a…

离心式冷水机组

离心式冷水机组是利用电作为动力源&#xff0c;氟利昂制冷剂在蒸发器内蒸发吸收载冷剂水的热量进行制冷&#xff0c;蒸发吸热后的氟利昂湿蒸汽被压缩机压缩成高温高压气体&#xff0c;经水冷冷凝器冷凝后变成液体&#xff0c;经膨胀阀节流进入蒸发器再循环。从而制取7℃-12℃冷…

解决jvm内存溢出的方法

上一篇问题讲了怎么实现jvm内存溢出,现在已经实现了,那怎么去解决它呢. java.lang.OutOfMemoryError: GC overhead limit exceeded 简单来说&#xff0c;java.lang.OutOfMemoryError: GC overhead limit exceeded发生的原因是&#xff0c;当前已经没有可用内存&#xff0c;经…

【IMX6ULL驱动开发学习】06.APP与驱动程序传输数据_自动创建设备节点(hello驱动)

一、APP与驱动之间传输数据 /*驱动从APP获取数据*/ unsigned long copy_from_user(void *to, const void *from, unsigned long n)/*驱动传输数据到APP*/ unsigned long copy_to_user(void *to, const void *from, unsigned long n)二、使用copy_to_user、copy_from_user在AP…

如何把视频声音转成文字?分享三个实用的方法!

在日常学习中&#xff0c;有些小伙伴可能想将视频课程中老师的讲解内容整理出来&#xff0c;但是逐字逐句地打字既低效又耗时。那么&#xff0c;如何将视频声音快速转换为文字呢&#xff1f;答案是使用记灵在线工具&#xff01;下面我将分享几种使用记灵在线工具快速将视频声音…

Raft is not great?

Raft相比于paxos不好的地方有下面这些地方 1.Term raft的逻辑时钟是通过term&#xff0c;和votefor来确定的&#xff0c;同时&#xff0c;raft的votefor只能是None < 有&#xff0c;有的话&#xff0c;就不可比&#xff0c;也就是一个偏序关系。这个不可比的特性会增加选举…

Javaweb学习路线(2)——Maven

一、概念 Maven 是 apache 旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 二、作用 依赖管理&#xff1a; 动态管理jar包&#xff0c;避免版本冲突。统一项目结构&#xff1a; 提供标准、统一的项目结构。项目构建&#xff1a; 标准跨平台的自动化项目…

深入探讨软件测试的质量度量指标

本文的目的是介绍项目中使用到主要质量指标&#xff0c;这些质量指标可以分为以下三类&#xff1a; 质量保证过程指标生产事故管理指标度量质量文化指标 质量保证过程指标 质量保证指标可以通过测试覆盖率来度量功能和非功能测试的覆盖率&#xff0c;同时也可以根据测试发现…

shell学习记录(函数)

Shell 函数 linux shell 可以用户定义函数&#xff0c;然后在shell脚本中可以随便调用。 shell中函数的定义格式如下&#xff1a; [ function ] funname [()] { action; [return int;] } 说明&#xff1a; 1、可以带function fun() 定义&#xff0c;也可以直接fun()…