while read line 用法详细介绍

循环中的重定向

或许你应该在其他脚本中见过下面的这种写法:

while read line

do

       …

done < file

刚开始看到这种结构时,很难理解< file是如何与循环配合在一起工作的。因为循环内有很多条命令,而我们之前接触的重定向都是为一条命令工作的。这里有一个原则,这个原则掌握好了,这个问题就很简单了:

对循环重定向的输入可适用于循环中的所有需要从标准输入读取数据的命令;

对循环重定向的输出可适用于循环中的所有需要向标准输出写入数据的命令;

当在循环内部显式地使用输入或输出重定向,内部重定向覆盖外部重定向。

上面的while结构中,read命令是需要从标准输入中读取数据的。我们来详细了解一下read命令的用法吧,这个命令是shell脚本中使用频率最高的命令之一。

read

先来看一下read的命令语法:

read arg1 arg2 arg3 arg4 …

read是一个用来赋值的命令,它需要从标准输入获得值,然后把这些值按位置依次赋值给变量arg1、arg2、arg3、arg4…,输入的时候以空格作为字段分隔符。

read的一个最大特性是可以在脚本中产生交互,因为它从标准输入读取数据。read之所以很常用,一是因为我们经常需要赋值,二是因为它可以交互,三是read能够一次给多个变量赋值。

$ read host ip name

linux 10.0.0.1 licong

$ echo $host $ip $name

linux 10.0.0.1 licong

$

可以看到,linux、10.0.0.1、licong分别被赋值给了变量host、ip和name。再看:

$ read host ip

linux 10.0.0.1 licong

$ echo $host

linux

$ echo $ip

10.0.0.1 licong

$

当我们输入的字段比变量数目多时,最后一个变量的值将不只一个字段,而是所有剩余的内容;当输入字段比变量数少时,多余的变量将是空值,你可以自己试试。现在我们再来看

while read line

do

       …

done < file

read通过输入重定向,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的处理;然后循环处理file的第二行、第三行。。。一直到file的最后一行。还记得while根据其后的命令退出状态来判断是否执行循环体吗?是的,read命令也有退出状态,当它从文件file中读到内容时,退出状态为0,循环继续惊醒;当read从文件中读完最后一行后,下次便没有内容可读了,此时read的退出状态为非0,所以循环才会退出。

另一种也很常见的用法:

command | while read line

do

    …

done

如果你还记得管道的用法,这个结构应该不难理解吧。command命令的输出作为read循环的输入,这种结构常用于处理超过一行的输出,当然awk也很擅长做这种事。



本文转自 wangergui 51CTO博客,原文链接:http://blog.51cto.com/wangergui/1846019,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++总结笔记(三)—— 结构体

一、概念 结构体是一种可以自定义数据类型的类型格式&#xff0c;一般用struct关键字进行定义。 //创建食物的结构体 struct Food {//属性名string name; //名字int Price; //价格 };结构体有三种定义变量的方法。 1.1 定义结构体后再声明变量&#xff0c;然后在对变量的…

[轻微]WEB服务器启用了OPTIONS方法/如何禁止DELETE,PUT,OPTIONS等协议访问应用程序/tomcat下禁用不安全的http方法...

使用了360网站安全检测 查到有OPTIONS方法 百度了下 https://my.oschina.net/maliang0130/blog/338725 找到这个方法奈何http.conf 找不到无论在tomcat目录里还是linux路径下的/usr/etc或者apache2 最后通过开源中国找到 第一步&#xff1a;修改应用程序的web.xml文件的协议 &l…

MVC 事物同时保存,更新数据库

本人小白一枚&#xff0c;第一次写博&#xff0c;主要用作笔记&#xff0c;怕以后忘记了&#xff0c;大神尙可路过&#xff0c;也可多多指教 事物用在同时保存更新数据时&#xff0c;及只要在事物块的范围内&#xff0c;有一个操作出错则事物块所有更新&#xff0c;保存等操作都…

【图像处理】——正装照换底色Python

import cv2 import numpy as np # 读取照片 img=cv2.imread("personalPic.jpg")# 图像缩放 img = cv2.resize(img,None,fx=0.3,fy=0.3) rows,cols,channels = img.shape print(rows,cols,channels)# img_medianBlur=cv2.medianBlur(img,3) # 中值滤波,必须是大于1的奇…

Halcon例程详解(植物测量) —— measure_plant.hdev

文章目录 前言一、过程1.1 筛选ROI区域1.2 分割1.3 三维建模与仿射变换1.4 确定叶子的角度分布和高度1.5 确定叶子的面积和树干的直径1.6 对叶子的角度进行分析二、例程详解2.1 筛选ROI区域2.2 分割2.3 三维建模与仿射变换2.4 确定叶子的角度和高度2.5 确定叶子的面积和树干的直…

keil5中文乱码的解决

keil5 复制出来的中文显示乱码&#xff0c;该如何解决&#xff1f; 点击Edit - Configuration &#xff0c;进入编辑器设置&#xff1a; 点击ok &#xff0c;就可以了转载于:https://www.cnblogs.com/alan666/p/8312100.html

spark RDD iterator中sparkEnv功能 -- (视频笔记)

sparkEnv是spark环境变量 1、可以从其中get 缓存 2、为master workder driver 管理和保存运行时对象。 3、excutorid &#xff0c;excutor 一种为driver类型&#xff0c;一种具体处理task 内部有线程池的excutor 4、actorSystem &#xff0c;如果运行在driver 则为spark driver…

【图像处理】——Python实现几何变换(自定义+opencv库)

理论知识:参考https://blog.csdn.net/on2way/article/details/40460675 Python调用opencv函数参考:https://blog.csdn.net/on2way/article/details/46801063 一、引自《数字图像处理》的基础知识汇总 这个很重要!!!这里需要注意的是反向映射和前向映射的区别,反…

Go语言学习资料整理

整理网上找到的Golang语言学习资料基础基础教程 书籍在线版Go 指南-A Tour of GoGo语言圣经&#xff08;中文版&#xff09;Effective Go中文版Go Web编程 build-web-application-with-golangGo入门指南 The Way to Go《The Way to Go》中文译本&#xff0c;中文正式名《Go入门…

C++总结笔记(四)—— 堆栈区域划分与引用实例解析

文章目录前言&#x1f600;一、概念1.1. 内存分区1.1.1 堆区1.1.2 栈区1.1.3 程序代码区1.1.4 全局/静态存储区1.1.5 常量存储区1.2. 引用二、程序示例总结前言&#x1f600; 在C的内存管理中&#xff0c;堆区和栈区是一个非常重要的概念&#xff0c;理解堆栈的相关知识&#…

学习Android MediaPlayer

Android Media Playback 原文 The Android multimedia framework includes support for playing variety of common media types, so that you can easily integrate audio, video and images into your applications. You can play audio or video from media files stored in…

spark2.0.1 安装配置

1. 官网下载 wget http://d3kbcqa49mib13.cloudfront.net/spark-2.0.1-bin-hadoop2.7.tgz 2. 解压 tar -zxvf spark-2.0.1-bin-hadoop2.7.tgz ln -s spark-2.0.1-bin-hadoop2.7 spark2 3. 环境变量 vi /etc/profile #Spark 2.0.1export SPARK_HOME/usr/local/spark2export PATH…

Spring Cloud各组件超时

Ribbon的超时 全局设置&#xff1a; ribbon:ReadTimeout: 60000ConnectTimeout: 60000局部设置&#xff1a; service-id:ribbon:ReadTimeout: 1000ConnectTimeout: 1000其中&#xff0c;service-id 是Ribbon所使用的虚拟主机名&#xff0c;一般和Eureka Server上注册的服务名称…

【图像处理】——遍历图像所有像素的方法(for 循环和np.where遍历)应用在模板制作

目录 具体np.where的用法可以参见: 其他遍历图像的所有像素的方法: 模板制作流程 Python代码

C++总结笔记(五)——构造函数和析构函数

文章目录前言一、基本概念1 构造函数2 析构函数二、示例1. 构造函数和析构函数的简单使用2. 拷贝构造函数的调用3. 浅拷贝和深拷贝前言 本文讲述了构造函数和析构函数的概念以及对应的示例&#xff0c;以便加深理解。 一、基本概念 1 构造函数 构造函数用于初始化类的对象&a…

LINUX 更新

sudo apt-get dist-upgrade,更新所有的软件转载于:https://www.cnblogs.com/jackieron/p/5997805.html

python实战===如何优雅的打飞机

这是一个打飞机的游戏&#xff0c;结构如下&#xff1a; 其中images中包含的素材为 命名为alien.png 命名为ship.png 游戏效果运行是这样的&#xff1a; 敌军&#xff0c;也就是体型稍微大点的&#xff0c;在上方左右移动&#xff0c;并且有规律向下移动。我军目标&#xff0c;…

【图像处理】——上采样、下采样、在模板匹配中的金字塔加速策略

目录 1、下采样 Python自带函数 自定义函数 Python实现下采样 2、上采样 Python自带函数 自定义函数<

C++总结笔记(六)——友元

文章目录前言一、基本概念二、程序示例1.全局函数调用私有成员2. 外部类调用私有成员3. 外部类的成员函数调用私有成员总结前言 一、基本概念 友元是C中为了方便类外的类或者函数访问类内私有成员而定义的一种特殊语法&#xff0c;用friend关键字进行修饰。 二、程序示例 友…

Java默认类型,类型转换,常量与变量笔记

默认类型&#xff1a; 在java里整数默认是int类型&#xff0c;小数默认是double类型&#xff0c;单个字符默认是char类型&#xff0c;true、false自然默认的是boolean类型&#xff0c;字符串默认的是String类型。 变量和常量类型转换&#xff1a; 因为有默认类型&#xff0c;在…