循环中的重定向

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

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也很擅长做这种事。

linux shell read line,【Linux shell】while read line相关推荐

  1. Linux操作系统学习笔记【入门必备】

    Linux操作系统学习笔记[入门必备] 文章目录 Linux操作系统学习笔记[入门必备] 1.Linux入门 2.Linux目录结构 3.远程登录 3.1 远程登录Linux-Xshell5 3.2 ...

  2. centos linux引导修复_【Linux 运维】 Centos7.x 系统修复模式

    一.linux的运行级别: 运行级别就是来确定系统启动时到底启动那个服务. linux默认有7个运行级别: 0 关机 1 单用户模式,用于系统修复 2 不完全的命令模式,不含NFS服务 3 完全的命令 ...

  3. linux命令功能ls,【Linux】- ls命令详解

    1 命令功能: 列出当前目录下或者指定目录下的所有文件和目录,ls是list的缩写. 2 命令语法: ls [选项] [目录名]     #注:[]中的内容为非必选项 3 命令选项: -a 列出目录下 ...

  4. linux网卡缓冲区设置,【Linux】tcp缓冲区大小的默认值、最大值

    Author:阿冬哥 Created:2013-4-17 Blog:http://blog.csdn.net/c359719435/ Copyright 2013 阿冬哥 http://blog.cs ...

  5. linux vim 命令无效,【工匠大道】一些Vim(Linux)不常见但很逼格的命令(不断更新中)...

    分享提纲: 普通的vim的移动,编辑等命令就不再赘述.这里主要是记录一些不常见但是很逼格的命令,使你瞬间感到精神为之一振的命令 1. :Tlist 1)该命令是列出当前文件中的类名,变量名和函数名,移 ...

  6. linux文件 run.man,【Linux】linux经常使用基本命令

    Linux中很多经常使用命令是必须掌握的,这里将我学linux入门时学的一些经常使用的基本命令分享给大家一下,希望能够帮助你们. 这个是我将鸟哥书上的进行了一下整理的,希望不要涉及到版权问题. 1.显 ...

  7. linux打开另一台linux的图形化,【工具大道】ssh登录Linux服务器,并显示图形化界面...

    点击关注微信公众号 "程序员的文娱情怀" 分享提纲: 1. 概述 2. mac版实现ssh登录,显示图形化 1. 概述 平时ssh登录到Linux服务器都是在命令行下进行操作的,简 ...

  8. linux远程工具_【linux实操3.1】linux远程连接工具Secure的使用

    把自己的闲置笔记本用来做centos7服务器了,同时也出一期教程,记录自己同时也帮助需要的人:安排如下 1.[linux实操1]华硕笔记本安装centos7实战 2.[linux实操2]使用yum在命 ...

  9. Linux 线程并发拷贝,【Linux】线程并发拷贝程序

    据说大连某211高校的李教授越来越重口,不仅延续要求他所带的每一个本科班,都要写一份线程并发拷贝程序的传统,而且还开始规定不能用Java语言写作,导致我之前写的<[Java]线程并发拷贝程序&g ...

  10. 【正点原子Linux连载】第三十七章 Linux内核移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

最新文章

  1. 数据质量和模型调优哪个更重要?
  2. ocr中文 java_java 中文ocr
  3. php 单例模式原理,PHP单例模式demo详解
  4. redis安装redis集群
  5. matlab可达矩阵 结果,matlab求可达矩阵
  6. 程序设计导引及在线实践_学院经纬计算学院程序设计基础与实验入选首批国家级一流本科课程...
  7. rsa前后端加密流程_不懂前后端分离?这篇就够了
  8. 华尔街英语学习软件_华尔街英语吧啦吧啦聊点啥:语言学习交流至上
  9. MDX Step by Step 读书笔记(三) - Understanding Tuples (理解元组)
  10. 数学分析(9): 不定积分
  11. Rufus创建Windows Server UEFI启动盘
  12. Windows安装Visio流程图软件
  13. 神经网络的5个应用场景,人工神经网络应用场景
  14. Win10下VS2019 C++ opencv3.4.x 环境搭建过程 | 找不到opencv_world347d.dll | error LNK2019: 无法解析的外部符号
  15. IIS短文件名漏洞修复
  16. ImageCompressor图片压缩
  17. 快手网址 - KuaiShou.NET
  18. 【FME EXCEL】FME玩转EXCEL小记——不定期更新
  19. 原生JS搭配canvas模式开发的调色盘
  20. 基于SSM框架的洗车店预约系统的设计与实现

热门文章

  1. 自制口袋妖怪_承诺和口袋妖怪-我如何学会异步思考
  2. mongo在哪创建管理员_MongoDB数据库创建管理员账户和数据库管理账户
  3. Python使用pyexecjs代码案例解析
  4. 小程序问题记录 | 使用官方提供的云数据库存储md格式的文件,前台解析遇到的坑!!!!
  5. JQuery上传插件Uploadify详解及其中文按钮解决方案
  6. 【opencv学习】ROI区域和图像填充
  7. 洛阳市高中学业水平计算机考试,2019年河南洛阳市高中学生学业水平考试考点及时间...
  8. c++中vecto容器r常使用的相关函数
  9. 【C++】C++读取文本中的特定一列
  10. leetcode - 39. 组合总和