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


    前言

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

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

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

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

    一. 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 名称。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

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

    参数描述
    -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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果你不是在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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

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

    3.4 read -p 提示信息

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

    #!/bin/bash
    
    # 提示用户输入姓名
    read -p "请输入您的姓名: " name
    
    # 根据用户的输入作出响应
    echo "您好,$name!欢迎访问我们的网站。"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

    #!/bin/bash
    
    # 提示用户输入密码
    read -s -p "请输入您的密码: " password
    echo
    
    # 根据用户的输入作出响应
    echo "您输入的密码是: $password"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    执行结果:

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

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

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

    #!/bin/bash
    
    # 提示用户输入年份,如果用户不输入则使用默认值
    read -i 2022 -p "请输入当前所处的年份(默认为2022): " year
    
    # 根据用户的输入做出反应
    echo "当前年份是: $year"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在上面的示例中,使用 -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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

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

    #!/bin/bash
    
    # 读取一个定长的验证码
    read -k 6 -p "请输入6位验证码: " code
    
    # 显示用户输入的验证码
    echo "你输入的验证码是: $code"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    code=$(openssl rand -hex 3)
    
    • 1

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

    总结

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

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

  • 相关阅读:
    AIR32F103(六) ADC,I2S,DMA和ADPCM实现的录音播放功能
    MCU设计--M3内核整体功能说明
    Maven的使用
    【Unity之UI编程】编写一个面板交互界面需要注意的细节
    Windows10中安装 docker desktop 报错:【WSL 2 installation is incomplete.】
    MySQL5.7安装详细过程--window系统
    Class文件结构和字节码指令集
    【总结】javascript中的同步与异步
    排序算法-归并排序
    SaaSBase:什么是BoardMix?
  • 原文地址:https://blog.csdn.net/wisdom_futrue/article/details/131156844