• 6-x1 read命令:从键盘读取数据


    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 -p "Enter a char > " char
    3. printf " #换行
    4. echo $char

    运行结果:

    Enter a char > 1
    1

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

    1.-n 1表示只读取一个字符。运行脚本后,只要用户输入一个字符,立即读取结束,不用等待用户按下回车键。
    2.printf " "语句用来达到换行的效果,否则 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 " && #第一次输入密码
    4. read -t 20 -sp "Enter password in 20 seconds(again)> " pass2 && printf " && #第二次输入密码
    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 中至少任意一个的文件尾

  • 相关阅读:
    iOS-iOS调用相机调用相册【将图片保存到本地相册】
    iOS-image图片压缩
    iOS-沙盒目录
    iOS-Xcode代码统计
    Django基础之Model操作
    Django objects.all() ,objects.get() ,objects.filter()之间的区别
    django从1.7升级到1.9后 提示:RemovedInDjango110Warning
    关闭TCP中135、139、445、593、1025 等端口的操作方法 (转)(记录下)
    oracle decode函数和 sign函数
    Apache的主要目录和配置文件详解
  • 原文地址:https://www.cnblogs.com/mianbaoshu/p/12069529.html
Copyright © 2020-2023  润新知