1.read的用法

read从 STDIN 读取一行数据并将其赋给一个变量,如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。

read 命令的用法为:

read [-options] [variables]

variables表示用来存储数据的变量,可以有一个,也可以有多个,options表示选项,如下表所示:
optionsvariables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。

选项
说明
-a array 把读取的数据赋值给数组 array,从下标 0 开始。
-d delimiter 用字符串 delimiter 指定读取结束的位置,而不是一个换行符(读取到的数据不包括 delimiter),其实只有-d后的第一个字符被作为结束的标志
-e

在获取用户输入的时候,对功能键进行编码转换,不会直接显式功能键对应的字符。

比如read -e -p "输入文件名:" str 执行后,输入文件名开头的几个字符,使用tab键可以进行文件名补全(文件在当前目录存在)

-n num 读取 num 个字符,而不是整行字符。空格也算是一个字符
-p prompt 显示提示信息,提示内容为 prompt。
-r 原样读取(Raw mode),不把反斜杠字符解释为转义字符。
-s 静默模式(Silent mode),不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这是很有必要的。
-t seconds 设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么 read 将会返回一个非 0 的退出状态,表示读取失败。
-u fd 使用文件描述符 fd 作为输入源,而不是标准输入,类似于重定向。

2.举栗

功能
脚本
结果
注意点
给多个变量赋值
  1. #!/bin/bash
  2. read -p "please input name age sex> " name age sex
  3. echo "name:"$name
  4. echo "age:"$age
  5. echo "sex:"$sex
运行结果:

  • please input name age sex> piaoyu 3 1
  • name:piaoyu
  • age:3
  • sex:1

1.必须在一行内输入所有的值,不能换行,否则只能给第一个变量赋值,后续变量都会赋值失败

2.使用了-p选项,该选项会用一段文本来提示用户输入

3.脚本中-p后的提示字符与变量name之间必须有一个空格,否则变量name会被当成提示信息的一部分

只读取一个字符
  1. #!/bin/bash
  2. read -n 1 -p "Enter a char > " char
  3. printf "\n" #换行
  4. echo $char

运行结果:

Enter a char > 1
1

不使用printf "\n"时的运行结果为Enter a char > 11

1.-n 1表示只读取一个字符。运行脚本后,只要用户输入一个字符,立即读取结束,不用等待用户按下回车键。
2.printf "\n"语句用来达到换行的效果,否则 echo 的输出结果会和用户输入的内容位于同一行,不容易区分。
常见场景用例
  1. #!/bin/bash
  2. read -n1 -p 'Do you want continue[Y/N]?' ans
  3. case $ans in
  4. Y|y)
  5. echo 'fine,continue';;
  6. N|n)
  7. echo 'ok,goodbye';;
  8. *)
  9. echo 'error';;
  10. esac
   
在指定时间内输入密码
  1. #!/bin/bash
  2. if
  3. read -t 20 -sp "Enter password in 20 seconds(once) > " pass1 && printf "\n" && #第一次输入密码
  4. read -t 20 -sp "Enter password in 20 seconds(again)> " pass2 && printf "\n" && #第二次输入密码
  5. [ $pass1 == $pass2 ] #判断两次输入的密码是否相等
  6. then
  7. echo "Valid password"
  8. else
  9. echo "Invalid password"
  10. fi
如果两次输入密码相同,运行结果为:
Enter password in 20 seconds(once) >
Enter password in 20 seconds(again)>
Valid password

如果两次输入密码不同,运行结果为:
Enter password in 20 seconds(once) >
Enter password in 20 seconds(again)>
Invalid password

如果第一次输入超时,运行结果为:
Enter password in 20 seconds(once) > Invalid password

如果第二次输入超时,运行结果为:
Enter password in 20 seconds(once) >
Enter password in 20 seconds(again)> Invalid password

1.&&组合多个命令时,这些命令会依次执行,但只要一个命令失败,后续命令都不会执行

把读取的数据赋值给一个数组
  1. #!/bin/bash
  2. read -a test_arr -p 'please input some values:'
  3. echo 'the num of the input values:'${#test_arr[*]}
  4. for item in ${test_arr[*]}
  5. do
  6. echo ${item}
  7. done
  1. please input some values:aa bb cc dd
  2. the num of the input values:4
  3. aa
  4. bb
  5. cc
  6. dd
 
-d

read -d delimiter -p 'please input data>' test_var

输出:please input data>test432d

echo $test_var

输出:test432

  1.使用-d指定分隔符后,只有-d后的第一个字符被作为结束标志

等待输出q退出

read -dq -p "Input some words end with q:" word

#输入,直到输入q,将自动退出  
-e

read -e -p "please input filename:" str

输出:please input filename:learn_ #按tab键

learn_arr.sh      learn_cmd.sh      learn_read1.sh    learn_read.sh     learn_spe_var.sh  learn_str.sh      #显示出所有相关的文件

继续输出:please input filename:learn_

   
读文件中的内容
  1. #!/bin/bash
  2. num=1
  3. cat learn_read1.sh|while read line
  4. do
  5. echo "current line:$num--$line"
  6. num=$[ $num+1 ]
  7. done
  8. echo 'finish'
  9. exit 0
  1. current line:1--#!/bin/bash
  2. current line:2--read -d 'rrr' -p 'pleass input some data>' name
  3. current line:3--echo ''
  4. current line:4--echo $name
  5. finish
 

-u

使用文件描述符 fd 作为输入源,而不是标准输入

#将afile文件中的前三行与bfile中的前四行拼接在一起

  1. while read -u3 i && read -u4 j;do
  2. echo $i $j
  3. done 3<afile 4<bfile

afile 的内容

bfile 的内容

输出

a
b
c

1
2
3
4

a 1
b 2
c 3
read -u3 i 的意思是从 3 号 fd (file descriptor,文件描述符) 中读一行数据到 i 变量中,而 3<afile 的意思是重定向 afile 到 3 号 fd 中
所以,整个代码的意思是,不断从 afile 和 bfile 中分别读取内容到i , j 中,然后用echo 打印出来。 这个循环会一直执行直到遇到 afile 或 bfile 中至少任意一个的文件尾

6-x1 read命令:从键盘读取数据的更多相关文章

  1. Java:IO流的综合用法(从键盘录入数据并打印在控制台上)

    import java.io.*; public class IOTestDouble { public static void main(String[] args)throws Exception ...

  2. 问题:从键盘读取特定类型的数据(使用Scanner读取int类型)

    import java.util.Scanner; public class ScannerIntTest{ public static void main(String [] args){ int ...

  3. c和c++中读取数据的方式总结

    目录 c 输出 printf() 输入 scanf getchar(), putchar() gets(), puts() c++ 输入 cin() getline() get() 输出 cout 最 ...

  4. ubuntu server 12.04U盘安装,提示无法挂载安装光盘或光盘读取数据出错

    今天用Ultraiso将Ubuntu server 12.04 刻入U盘中安装系统,中间提示错误:1.检测不到cdrom(即U盘没有挂载上):2.从光盘中读取数据出错.问题如下图所示: 上网搜了下解决 ...

  5. 【转】基本数据持久性(一) 使用plist保存和读取数据

    原文网址:http://www.it165.net/pro/html/201309/7170.html 想保存成绩.记录得分.保存账号密码等等?数据持久性可以做到这一点!这篇文章通过简单的程序,来分享 ...

  6. Redis 中文入库成功,读取数据写入文件乱码问题

    近期须要用到redis ,可是在编码这个问题上,纠结了非常久.        需求 :每天一个进程将中文文件入库到redis中(不定时更新) ,另外几个进程读取redis中的信息 ,并处理数据结果.使 ...

  7. Hadoop权威指南:从Hadoop URL读取数据

    [TOC] Hadoop权威指南:从Hadoop URL读取数据 使用java.net.URL对象从Hadoop文件系统读取文件 实现类似linux中cat命令的程序 文件名 HDFSCat.java ...

  8. bash内置命令mapfile:读取文件内容到数组

    bash提供了两个内置命令:readarray和mapfile,它们是同义词.它们的作用是从标准输入读取一行行的数据,然后每一行都赋值给一个数组的各元素.显然,在shell编程中更常用的是从文件.从管 ...

  9. 第十二节,TensorFlow读取数据的几种方法以及队列的使用

    TensorFlow程序读取数据一共有3种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据. 从文件读取数据: 在TensorFlow图的起 ...

随机推荐

  1. JavaWeb Session 状态管理

    引言 HTTP 协议是一个无状态的协议,简单理解就是两次请求/响应无法记录或保存状态信息.但是动态 Web 项目开发是需要保存请求状态的,比如用户的登录状态,但 HTTP 协议层不支持状态保存,所以需 ...

  2. element-ui 的el-select如何不显示value,显示value对应的label值

    有时根据需要,我们根据v-model的值绑定option, 想要的效果: 实际的效果: 原因: value的格式存在问题,数据库读取到的数据不一定为number类型,需要手动转换. 第一种 <t ...

  3. 单点突破:MySQL之基础

    前言 开发环境:MySQL5.7.31 本文并不是mysql语法语句的教程或者笔记,如果初学MySQL,想要看sql的教程或者学习各种语法语句规范,可以看看一千行MySQL学习笔记或者MySQL教程| ...

  4. P5837 [USACO19DEC]Milk Pumping G

    题目描述 Farmer John 最近为了扩张他的牛奶产业帝国而收购了一个新的农场.这一新的农场通过一个管道网络与附近的小镇相连,FJ 想要找出其中最合适的一组管道,将其购买并用来将牛奶从农场输送到小 ...

  5. 十一、diff和patch打补丁

    diff制作补丁文件的原理:告诉我们怎么修改第一个文件后能得到第二个文件. diff命令常用选项: -u 输出统一内容的头部信息(打补丁使用),计算机知道是哪个文件需要修改    -r 递归对比目录中 ...

  6. 十一、设置Nginx开机自启动

    一.创建nginx.service文件 [root@svr7 ~]# vim /lib/systemd/system/nginx.service [Unit]Description=nginx ser ...

  7. 【NX二次开发】Block UI 曲线收集器

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  8. 【NX二次开发】UF_OBJ_ask_display_properties获取对象所在层、获取对象颜色、获取对象是否隐藏、获取对象是否高亮,获取对象线宽、字体大小

    UF_OBJ_ask_display_properties 返回一个对象的显示属性(层.颜色.隐藏状态.线宽和字体). UF_OBJ_disp_props_p_t结构体: layer int 对象所在 ...

  9. NOIP模拟测试9「随·单·题」

    liu_runda出的题,先$\%\%\%\%\%\%\%\%\%\%\%$为敬 随 考试时没有Qj 然后甚至没做,甚至没交 我不知道我怎么想的 这个题挺难改 你需要用到 循环矩阵快速幂,矩阵快速幂优 ...

  10. VisualCom软件仿真平台V1.0发布(附安装包下载链接)

    自我们借助VisualCom(暂定名称,后续可能会变更)软件平台撰写技术文章以来,有不少粉丝发私信询问该软件哪里来的,以及哪里有安装包,这里回复一下:VisualCom软件平台是由本微信公众号组织开发 ...