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

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

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

使用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

shell学习三十二天----read读取一行的更多相关文章

  1. [Bash Shell] Shell学习笔记

    1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命 ...

  2. shell学习笔记

    shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...

  3. Shell学习之Shell特性(一)

    Shell学习之Shell特性 目录 命令和文件自动补齐功能 命令历史记忆功能 history.上下键.!number.!string.!$.!! 别名功能 alias.unalias cp.~use ...

  4. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  5. shell学习笔记汇总

    1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...

  6. Shell学习(七)——sort、uniq、cut、wc命令详解

    Shell学习(七)--sort.uniq.cut.wc命令详解 转自:[1]linux sort,uniq,cut,wc命令详解 https://www.cnblogs.com/ggjucheng/ ...

  7. 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等

    1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...

  8. Shell学习之环境变量配置文件(三)

    Shell学习之环境变量配置文件 目录 环境变量配置文件简介 环境变量配置文件作用 其他配置文件和登录信息 环境变量配置文件简介 环境变量配置文件简介 环境变量配置文件中主要是定义对系统操作环境生效的 ...

  9. go学习之文件读取问题(需更新)

    go学习之文件读取问题(需更新) 一,问题: 今天做一个GO广度迷宫问题时,出现了一个奇怪的问题. 就是通过fmt.Fscanf()读取文件时,每行末尾多出一个0. 二,问题代码: 1,输入文件maz ...

随机推荐

  1. linux基础命令学习(十二)yum命令

    主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它能便于管理大量系统的更新问题   yum list|more               列出所有包文件,可搭配grep查 ...

  2. slf4j使用

    pom jar包引用<!-- Logging --> <dependency> <groupId>ch.qos.logback</groupId> &l ...

  3. Use two picogate devices for bidirectional level-shifting

    In new mixed-voltage systems, it is often necessary to level-shift a control signal from a high leve ...

  4. Wifi模块的工作原理

    http://www.wifitop1.com/news/content-98.html 在无线网络领域里面,无线wifi是最火的名词.对于串口wifi模块的工作是什么呢?串口wifi模块又有什么功能 ...

  5. 【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏

    [案例一] 作者:老王 如果PHP对象存在递归引用,就会出现内存泄漏.这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,代码如下: <?php class Foo { funct ...

  6. OOW 2015 MYSQL

    https://events.rainfocus.com/oow15/catalog/oracle.jsp?search.event=openworldEvent&search.mysql=d ...

  7. DotNet.Utilities工具类

    来源:http://git.oschina.net/kuiyu/dotnetcodes/tree/master/DotNet.Utilities

  8. 判断终端是ios还是安卓的一些妙用(附加微信分享图标修改)

    最近遇到一个项目 要求有两个icon(就是下载地址 下载安卓的apk  和ios的安装包) 一开始的方案是 什么设备都显示这两个icon 但是后来老大说这样不好   安卓用户给他下载ios 也不行  ...

  9. Android中各级目录的作用

    Android中各级目录的作用 一.目录结构  src目录---存放源代码文件   gen目录---ADT插件生成的文件,(自动生成) R.java文件  drawable类---给图片生产的ID  ...

  10. 容器+AOP实现动态部署(四)

    上篇咱们介绍了容器和AOP的结合,结合后怎样将对象增强服务并没有过多的说明,这里将详细说明怎样将对象 进行增强 ,达到一个一对多和多对多的增强方式 先从简单的方式说起 /** *JDK代理类,实现动态 ...