• shell学习三十二天----read读取一行


    标准输入输出与标准错误输出

    标准输入/输出可能是软件工具设计原则里最主要的观念了.他的构想是:程序应有一个数据来源,数据出口(数据要去哪里),以及报告问题的地方.他们分别叫做标准输入,标准输出和标准错误输出.程序应该不知道也不在意其输入与输出背后是还有一个运行的程序!程序能够预期,在他启动的时候,这些标准位置都已打开,且已经准备好能够使用了.

    默认情况下,程序会读取标准输入,写入标准输出,并将错误信息传递给标准错误输出.这种程序我们称为过滤器,由于他们过滤数据流,每个都会在数据流上运行某种运算,再通过管道,将它传递给下一个.

    使用read读取行

    read命令是用于从终端或者文件里读取输入的内部命令,read命令读取整行输入,每行末尾的换行符不被读入.read后面,假设没有指定变量名,读取的数据将被自己主动赋值给特定的变量REPLY.

    语法:

    read [-r] variable

    用途:将信息读入一个或多个shell变量

    主要选项:

    -r:原始读取,不作不论什么处理.不将行结尾处的反斜杠解释为续行字符.

    行为模式:

    自标准输入读取行(数据),通过shell字段分割的功能(使用$IFS)进行切分.第一个单词赋值给第一个变量,第二个单词则赋值给第二个变量,以次类推.假设单词多于变量,则全部剩下的单词,全赋值给最后一个变量.read一旦遇到文件结尾,会以失败退出.

    假设输入行以反斜杠结尾,read会丢弃反斜杠与换行符,然后继续读取下一行数据.假设使用-r选项,那么read便会以字面意义读取最后的反斜杠.

    警告:

    当你将read应用在管道里时,很多shell会在一个分开的进程内运行它.在这样的情况下,不论什么以read所设置的变量,都不会保留他们在父shell里的值.对管道中间的循环,也是这样.

    案例一:

    bash代码:

    #!/bin/bash

    read -p "input Numbers"

    echo $REPLY

    运行结果为:input Numbers $REPLY(你所输入的数字)

    案例二:

    #!/bin/bash

    two()

    {

            read -p "input 2 numbers" v1 v2

            echo $(($v1+$v2))

    }

    two

    运行: ./read1.sh 

    输出结果:input 2 numbers  5 6

    11

    案例三:

    #!/bin/bash

    read -n 1 -p "Do you want to continue [Y/N] ?

     " answer

    case $answer in

            Y|y)

            echo "continue"

            ;;

            N|n)

            echo "break"

            ;;

            *)

            echo "error"

            ;;

    esac

    exit 0

    分析:该样例使用了-n选项,-n选项的意思是说后面能够接受多少个字符的输入,这里指定了1表示接受一个字符就退出,也就是说仅仅要按下一个键就会马上接受输入并将其传递给变量.无需按回车符.

    案例四:

    #!/bin/bash

    if read -t 5 -p "please enter your name:" name

    then 

            echo "hello $name,welcome to my world"

    else

            echo "sorry ,too slow"

    fi

    exit 0

    分析:这里使用了-t选项,使用read命令会存在潜在的危急.脚本非常可能会停下来一直等待用户的输入.假设不管是否输入数据脚本都必须继续运行,那么能够使用-t选项指定一个定时器.-t选项指定read命令等待输入的秒数.当计数达到-t运行的时间时,read命令返回一个非零退出状态.-t选项后面指定的是秒数.

    案例五:

    #!/bin/bashread  -s  -p "Enter your password:" passecho "your password is $pass"exit 0 

    分析:s选项可以使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,仅仅是read命令将文本颜色设置成与背景同样的颜色)。

    案例六:

    怎样得到一个仅仅有IP的字符串?

    /sbin/ifconfig eth0 | grep Bcast | sed -e 's/^.* addr:(.*) Bcast.*$/1/'

    想要实现输入一个IP跟机器上的IP对比,观察是否存在.

    #!/bin/bash

    ip=$(/sbin/ifconfig eth0 | grep Bcast | sed -e 's/^.* addr:(.*) Bcast.*$/1/')

    read var

    #echo $ip

    if [ "$var" = "$ip" ]

    then

            echo "Ok"

    else

            echo "no"

    fi

    分析:回想一下sed命令,sed命令是一种在线编辑器,一次处理一行内容.sed命令的-e选项是说多点编辑,此处相当于:

    ifconfig eth0 |grep "inet" | sed 's/^.*addr://g'| sed 's/Bcast.*$//g'

    sed參考连接:

    http://blog.csdn.net/dawnstar_hoo/article/details/4043887

    关于特殊符号的參考:

    http://www.ahlinux.com/shell/9964.html

  • 相关阅读:
    转载+自己心得
    分享
    领域驱动设计系列文章汇总
    ABP集合贴
    MVC学习系列——参考
    MVC学习系列——RazorViewEngine扩展
    MVC学习系列——Model验证扩展
    MVC学习系列——HtmlHelper扩展
    MVC学习系列——ModelBinder扩展
    MacBook强制清除gardle缓存
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6789066.html
Copyright © 2020-2023  润新知