精华内容
下载资源
问答
  • 分支结构和流程图

    千次阅读 2019-03-17 08:57:28
    1.if分支 2.swith 3.流程图

    1.if分支
    (1)if(条件){循环体}
    注:if条件后的{}可以省略。有大括号的时候大括号里面所有的都归if管。只有条件为真的时候才会执行。没有大括号的时候只有下面的一句归if管,也就是说当只有一句的时候大括号可以省略其它的没区别。也就是只有执行语句为一句话(而不是多句话)时,{}可以省略。但是为了养成良好的编码习惯,同学们最好不要省略!
    (2)if(条件){循环体}else{另一种情况}
    1.else结构放在if的下边和if搭配使用。
    2.if和else下边用{}表达一个管辖范围,这时是不能像普通语句那样在最后带分号。
    (3)多重if结构
    if(条件){循环体}else if(条件){循环体}。。。。
    2.swith
    (1)switch的运行规则:“先匹配(只一次)后贯穿执行,遇到break才跳出”。case内部可以嵌套使用 if-else结构,甚至是另一个switch结构。
    byte short int char
    (2)嵌套if-else
    专属指导:有多个分支的控制变量(本题目中为 性别 和 距离),并且分支变量之间有递进的关系的要使用嵌套的分支结构。
    3.流程图

    展开全文
  • Scrapy框架流程图解析

    万次阅读 多人点赞 2018-07-12 15:27:15
    接下来就放一张scrapy的流程图喽~ 简单叙述一下每层图的含义吧: Spiders(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler...
    今日语:心空,望望远方的高楼;心属,依然停留

    这里写图片描述

    接下来就放一张scrapy的架构图喽~(绿线是数据流向)

    这里写图片描述

    简单叙述一下每层图的含义吧:

    • Spiders(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)
    • Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
    • Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
    • Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理
    • ItemPipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
    • Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
    • Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间
    • 通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
    Scrapy执行流程图

    这里写图片描述

    1.用scrapy框架的时候,一定要先明白执行的顺序,代码已写好,程序开始运行~
    • SPIDERS的yeild将request发送给ENGIN
    • ENGINE对request不做任何处理发送给SCHEDULER
    • SCHEDULER( url调度器),生成request交给ENGIN
    • ENGINE拿到request,通过MIDDLEWARE进行层层过滤发送给DOWNLOADER
    • DOWNLOADER在网上获取到response数据之后,又经过MIDDLEWARE进行层层过滤发送给ENGIN
    • ENGINE获取到response数据之后,返回给SPIDERS,SPIDERS的parse()方法对获取到的response数据进行处理,解析出items或者requests
    • 将解析出来的items或者requests发送给ENGIN
    • ENGIN获取到items或者requests,将items发送给ITEMPIPELINES,将requests发送给SCHEDULER
      注意!只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy也会重新下载。)
      这里写图片描述

    1.引擎:Hi!Spider, 你要处理哪一个网站?

    2.Spider:老大要我处理xxxx.com。

    3.引擎:你把第一个需要处理的URL给我吧。

    4.Spider:给你,第一个URL是xxxxxxx.com。

    5.引擎:Hi!调度器,我这有request请求你帮我排序入队一下。

    6.调度器:好的,正在处理你等一下。

    7.引擎:Hi!调度器,把你处理好的request请求给我。

    8.调度器:给你,这是我处理好的request

    9.引擎:Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求

    10.下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)

    11.引擎:Hi!Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的)

    12.Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。

    13.引擎:Hi !管道 我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。
    14.管道“调度器:好的,现在就做!

    使用Scrapy框架爬虫的几条重要的命令

    创建项目:scrapy startproject xxx
    进入项目:cd xxx
    基本爬虫:scrapy genspider xxx(爬虫名) xxx.com (爬取域)
    还有一条是规则爬虫的命令,只是这条有变化,前俩条不变
    规则爬虫:scrapy genspider -t crawl xxx(爬虫名) xxx.com (爬取域)
    运行命令:scrapy crawl xxx -o xxx.json

    开发Scrapy爬虫的步骤~

    创建项目:scrapy startproject xxx(项目名字,不区分大小写)
    明确目标 (编写items.py):明确你想要抓取的目标
    制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
    存储内容 (pipelines.py):设计管道存储爬取内容
    启动程序的py文件(start.py):等同于此命令(scrapy crawl xxx -o xxx.json)
    from scrapy import cmdline
    cmdline.execute("scrapy crawl 项目名".split())

    爬虫中的常用命令~

    这里写图片描述

    scrapy保存信息的最简单的方法主要有七种格式
    json格式,默认为Unicode编码

    scrapy crawl 项目名 -o 项目名.json

    json lines格式,默认为Unicode编码

    scrapy crawl 项目名 -o 项目名.jsonlines

    csv 逗号表达式,可用Excel打开

    scrapy crawl 项目名 -o 项目名.csv

    xml格式

    scrapy crawl 项目名 -o 项目名.xml

    Parse()方法的工作机制

    1.因为使用的yield,而不是return。parse函数将会被当做一个生成器使用。scrapy会逐一获取parse方法中生成的结果,并判断该结果是一个什么样的类型;
    2. 如果是request则加入爬取队列,如果是item类型则使用pipeline处理,其他类型则返回错误信息。
    3. scrapy取到第一部分的request不会立马就去发送这个request,只是把这个request放到队列里,然后接着从生成器里获取;
    4. 取尽第一部分的request,然后再获取第二部分的item,取到item了,就会放到对应的pipeline里处理;
    5. parse()方法作为回调函数(callback)赋值给了Request,指定parse()方法来处理这些请求 scrapy.Request(url, callback=self.parse)
    6. Request对象经过调度,执行生成 scrapy.http.response()的响应对象,并送回给parse()方法,直到调度器中没有Request(递归的思路)
    7. 取尽之后,parse()工作结束,引擎再根据队列和pipelines中的内容去执行相应的操作;
    8. 程序在取得各个页面的items前,会先处理完之前所有的request队列里的请求,然后再提取items。
    7. 这一切的一切,Scrapy引擎和调度器将负责到底。

    下篇代码实战,更深刻的了解一下喽~
    这里写图片描述

    结束语:最累的时候,家人是你最好的归宿。

    有兴趣关注个公众号呗~
    这里写图片描述

    展开全文
  • 产品经理必备技能之业务流程图

    千次阅读 2019-12-08 13:30:06
    业务流程图(TFD)是一种描述管理系统内各单位、人员之间的业务关系,作业顺序和管理信息流向的图表。 流程是为了达到特定的目标而进行的一系列有逻辑性的操作过程,它可以不规范、可以充满问题,但它确确实实存在着。...

    原创不易,麻烦点个关注,点个赞,谢谢各位。

    业务流程图(TFD)是一种描述管理系统内各单位、人员之间的业务关系,作业顺序和管理信息流向的图表。

    流程是为了达到特定的目标而进行的一系列有逻辑性的操作过程,它可以不规范、可以充满问题,但它确确实实存在着。只要有事情或任务,就会有流程的存在,将有一定规律的流程用图表表示出来可以让流程可视化,从而有利于流程的重组优化。

    在工作中,我们常用到的流程图有:业务流程图、页面流程图和数据流程图。作为产品,经常谈的是业务流程图;作为交互设计师,则比较关心页面流程图;而作为系统分析师,数据流程图最关键。

    业务流程图

    业务流程图的作用是表达清楚业务需求在产品线的各个阶段中在各个功能模块之间的轮转。

    通常情况下,一个业务需求不仅仅对应一个功能需求,而是由多个功能需求组成的,举例来说:业务需求是注册,那么功能需求就包括填写信息的正则校验,验证码的生成与校验,注册协议查看(和勾选),此外,后台还要有账户生成与信息记录的功能,需要手机注册的还要有短信的发送与验证功能(邮箱注册同理)。

    可见,业务需求要求概括精炼,功能需求要求详细具体。一个业务需求通常涵盖多个功能需求,涉及前端展示、后台记录等多个部分,所以业务流程图通常复杂详细,尽量能够涵盖各种异常情况(每种异常情况都有相应的前、后台解决方案)。

    业务流程图的绘制思路一般是:

    首先将业务按阶段划分,比如电商类可以分为下单和支付,单车类可以分为提车、骑行和停车;

    然后列出每个阶段参与的功能模块,比如下单阶段,就有商品查看、登录/注册、信息记录、个人中心等功能。

    最后按照时间顺序,画出业务需求在各个功能模块之间的流转情况。

    为了输出一份完整的业务流程图,一般有两个原则:

    先思考主干流程,再思考分支流程,主干流程逻辑准确,分支流程全面无遗漏;

    表达清楚后台产生的各种判断及相应的前端展示,这将作为接口设计的重要根据。

    下面以电商购物的实例,绘制一份业务流程图
    在这里插入图片描述
    一个完整的电商购物流程,通常包含两个阶段,五个部分,两个阶段就是下单和支付,五个部分是用户、交易、账号系统&个人中心、支付系统和CRM系统,如果仅仅从用户角度出发,很难考虑到后台各种判断和操作,那样就变成了任务流程图,而这个图中包含了购物流程的用户操作、前端展示和后台判断,体现了实现购物业务所需要提供的功能和各部门的支持,在这个图中也能看出所需要的接口和数据。

    业务流程图应该是拿到业务需求(或BRD)后,首先输出的文档,而且并不是一成不变的,会在对业务需求或者BRD的多次讨论中不断补充完善,最后成为整个项目的标杆文件,在构建技术架构和技术分工时,将其作为主要参考。所以,绘制业务流程图时,一定要逻辑清晰,不能遗漏任何一个重要部分。

    任务流程图

    任务流程图表达的是用户在执行某个具体的任务时的工作流程。任务流程图可以理解为一个简化版的业务流程图,只有主要的操作步骤,通常在写用户体验报告时,利用任务流程图表达页面流转和主要操作,同样以电商购物为例:
    在这里插入图片描述
    由上可见,相比于业务流程图,任务流程图的特点是:

    只展现用户的操作,不展现后台的判断;

    只展现正常流程,不展现异常流程;

    只可查看用户的工作流程,无法作为开发的参考。

    不管是绘制业务流程图还是任务流程图,重点都应放在逻辑关系上,而不是图形本身的细节。说到底,流程图只是帮助我们更好地进行分析思考的工具,能够画出逻辑清晰的流程图,不一定对每个模块都了如指掌,但如果流程图逻辑混乱、含糊不清,那么肯定要反思是不是对业务需求或者功能需求的理解不清晰。作为刚入门的新手,结合思维导图,经常分析产品的业务流程和任务流程,对提高逻辑感和产品思维,还是很有帮助的。

    1.业务流程图的两种图表类型

    (1)管理业务流程图

    我们现在所说的流程图其实是传统的管理业务流程图,包含基本流程图和跨职能流程图(泳道图)两种。以医院挂号流程为例。
    在这里插入图片描述
    基本流程图虽然明确地说明了整个流程,但却无法清楚地说明每步流程是由哪个角色负责的。为了有效表示各个流程是由谁来负责的,可以通过泳道流程图来实现,这样不仅体现了整个活动控制流,还能清楚知道各个角色在流程中所承担的责任。

    管理业务流程图已基本能满足业务流程走向的表达,但在复杂的系统交互中,表达并发概念时,传统的管理业务流程图已无法表达,这就需要用到UML建模。

    (2)UML活动图

    UML中共定义了13种图,如下,其中用例图、活动图和顺序图用的比较多。
    在这里插入图片描述
    UML细分了各种图,分别在不同的角度来描述系统流程,在本质上,UML各种图均属于流程图。

    其中UML中活动图同管理业务流程图类似可用于表示业务过程,唯一的区别是活动图支持并行行为。传统的流程图着重描述处理过程,它的主要控制结构是顺序、分支和循环,各个处理过程之间有严格的顺序和时间关系;而UML活动图描述的是对象活动的顺序关系所遵循的规则,它着重表现的是系统的行为,而非系统的处理过程。

    那UML活动图是如何来表示并发业务流程的呢?

    UML活动图也可包含为基本活动图和泳道活动图,表达的方式与管理业务流程图差不多,但图例上稍有不同(图例区别可参考下方)。

    在这里插入图片描述
    同管理业务流程图一样,泳道让流程中个角色的分工一目了然。一个泳道表示流程内的一个角色,泳道内仅仅画出该泳道所表示角色完成的活动(判断,并行等可以画在任意泳道)。

    总结:管理业务流程图或UML活动图均可以用来表达业务流程,具体使用哪种图来表达业务流程可以凭君喜好,但要遵循一定的符号结构,不要混搭。不过要表达并行行为的还是使用UML活动图吧。

    2.两种流程图图例和结构
    (1)管理业务流程图

    管理业务流程图的常用符号如下,其基本结构包含:顺序结构、选择(分支)结构、循环结构。
    在这里插入图片描述
    在这里插入图片描述
    (2)UML活动图

    UML活动图的常用符号如下,其基本结构除了顺序结构、选择(分支)结构和循环结构外,还可能存在并发的事件流。在UML中,可以采用一个同步线来说明这些并行控制流的分岔和汇合。

    在这里插入图片描述
    同步线:分岔是有一个进入转换,两个或多个离开转换;而汇合则是两个或多个进入转换,一个离开转换。
    在这里插入图片描述
    3.如何绘制流程图?
    (1)在开始绘制业务流程图之前需要先想清楚的2个问题:

    1)所要描述的是哪一段业务流程?

    在画流程图之前先确定业务流程起终点,是截取某一段业务进行详细描述,还是整体业务模块进行描述。不可能将所有的流程都放到一个图里展示,也不可能大而笼统不画出关键事件,要学会划分业务流程范围,把握粒度。

    举例

    还是以医院挂号看病为例,先挂号再看病。整个流程下来其实可以细分为两个流程,分别为挂号流程和看病流程;甚至粒度可以再细点,分为取小票流程、挂号流程、缴挂号费流程、排队看病流程等,但很明显,单独分析取小票流程和缴挂号费流程粒度过小,没有实际意义。

    总结:可采用自顶向下,逐层分解的绘制方法。明确你要梳理的业务流程范围,首先列出流程中的关键事件,如医院挂号看病,挂号流程和看病流程便算是整个流程中的关键事件流程;再结合你分析的目的来判断是否需要再往下层进行分解,如取小票流程、挂号流程、缴挂号费流程、排队看病流程。如此例,层层向下分解,直到符合你要分析的目的,当目的是为了对某个业务流程进行优化时,则分解到对应流程即可,绘制出流程图后再进行分析。

    2)所要描述的业务流程是否涉及到参与者?

    涉及到参与者的业务流程使用泳道图来描述更简单明了。
    

    举例

    业务简要描述:数学老师让小丽帮忙把讲台上的写了名字的语文课本送给语文老师,语文老师接下后微笑着对小丽说谢谢。

    分析:包含了数学老师、小丽、语文老师这三个参与者,此时用泳道流程图更合适。

    (2)问题想明白了之后便可以对业务流程进行梳理,进而分解各个要素。

    业务流程图有4个关键要素:执行操作、顺序、输入输出、规则;要更清楚的描述业务流程可以有参与者这一要素。

    执行操作:执行了什么操作

    顺序:操作产生的顺序

    输入输出:发生操作的原因和结果

    规则:操作产生的条件

    参与者:谁参与了这个流程,可以是系统、可以是页面,也可以是用户

    以上个例子为例进行分解:

    业务简要描述:数学老师让小丽帮忙把讲台上的写了名字的语文课本送给语文老师,语文老师接下后微笑着对小丽说谢谢。

    执行操作和顺序(含输入输出):请求帮忙、接受帮忙、拿讲台上的语文课本、递交课本、接收课本、道谢

    规则:必须是写了名字的语文课本

    参与者:数学老师、小丽、语文老师

    在这里插入图片描述
    以上是明确给出了业务描述,按照步骤基本上便能画出业务流程图。在没有明确给出业务描述的情况下,对业务流程的梳理主要有两种方式:

    1)深入现场调查,由工作人员介绍业务处理过程。

    在这里插入图片描述
    2)对现有业务流程的优化。当已经对现有业务流程熟悉时,通过讨论和分析,可梳理出业务流程,再通过优化现有流程中不合理的地方,从而给出一个更好的流程来。

    (3)流程图规范

    各图形形状/字号统一。如果各个图形形状大小/字号相差悬殊,这对于理解图形的人也是一种折磨,对于某个比较重要的流程可以使用颜色来区分其他普通流程(但颜色数量和种类不应太多,以免重点模糊),再在该重要的流程旁加上注释说明,就能将重点转达给对方。

    流程名用动宾结构,如输入手机号。

    流程均以开始框开始,以结束框结束。

    流程图从左到右、从上到下排列。

    流程线尽量不要交叉。

    展开全文
  • 流程控制 while/until 循环

    千次阅读 2020-10-23 09:20:52
    在前面的章节中,我们开发了菜单驱动程序,来产生各种...在这一章中,我们将看一个叫做循环的程序概念,其可用来使程序的某些部分重复。shell 为循环提供了三个复合命令。 本章我们将查看其中的两个命令,随后章节介绍

    在前面的章节中,我们开发了菜单驱动程序,来产生各种各样的系统信息。虽然程序能够运行, 但它仍然存在重大的可用问题。它只能执行单一的选择,然后终止。更糟糕地是,如果做了一个 无效的选择,程序会以错误终止,而没有给用户提供再试一次的机会。如果我们能构建程序, 以致于程序能够重复显示菜单,而且能一次由一次的选择,直到用户选择退出程序,这样的程序会更好一些。

    在这一章中,我们将看一个叫做循环的程序概念,其可用来使程序的某些部分重复。shell 为循环提供了三个复合命令。 本章我们将查看其中的两个命令,随后章节介绍第三个命令。

    循环

    日常生活中充满了重复性的活动。每天去散步,遛狗,切胡萝卜,所有任务都要重复一系列的步骤。 让我们以切胡萝卜为例。如果我们用伪码表达这种活动,它可能看起来像这样:

    1. 准备切菜板

    2. 准备菜刀

    3. 把胡萝卜放到切菜板上

    4. 提起菜刀

    5. 向前推进胡萝卜

    6. 切胡萝卜

    7. 如果切完整个胡萝卜,就退出,要不然回到第四步继续执行

    从第四步到第七步形成一个循环。重复执行循环内的动作直到满足条件“切完整个胡萝卜”。

    while

    bash 能够表达相似的想法。比方说我们想要按照顺序从1到5显示五个数字。可如下构造一个 bash 脚本:

    #!/bin/bash
    # while-count: display a series of numbers
    count=1
    while [ $count -le 5 ]; do
        echo $count
        count=$((count + 1))
    done
    echo "Finished."
    
    

    当执行的时候,这个脚本显示如下信息:

    [me@linuxbox ~]$ while-count
    1
    2
    3
    4
    5
    Finished.
    
    

    while 命令的语法是:

    while commands; do commands; done
    
    

    和 if 一样, while 计算一系列命令的退出状态。只要退出状态为零,它就执行循环内的命令。 在上面的脚本中,创建了变量 count ,并初始化为1。 while 命令将会计算 test 命令的退出状态。 只要 test 命令返回退出状态零,循环内的所有命令就会执行。每次循环结束之后,会重复执行 test 命令。 第六次循环之后, count 的数值增加到6, test 命令不再返回退出状态零,且循环终止。 程序继续执行循环之后的语句。

    我们可以使用一个 while 循环,来提高前面章节的 read-menu 程序:

    #!/bin/bash
    # while-menu: a menu driven system information program
    DELAY=3 # Number of seconds to display results
    while [[ $REPLY != 0 ]]; do
        clear
        cat <<- _EOF_
            Please Select:
            1\. Display System Information
            2\. Display Disk Space
            3\. Display Home Space Utilization
            0\. Quit
        _EOF_
        read -p "Enter selection [0-3] > "
        if [[ $REPLY =~ ^[0-3]$ ]]; then
            if [[ $REPLY == 1 ]]; then
            echo "Hostname: $HOSTNAME"
            uptime
            sleep $DELAY
            fi
        if [[ $REPLY == 2 ]]; then
            df -h
            sleep $DELAY
        fi
        if [[ $REPLY == 3 ]]; then
            if [[ $(id -u) -eq 0 ]]; then
                echo "Home Space Utilization (All Users)"
                du -sh /home/*
            else
                echo "Home Space Utilization ($USER)"
                du -sh $HOME
            fi
        sleep $DELAY
        fi
        else
            echo "Invalid entry."
            sleep $DELAY
        fi
    done
    echo "Program terminated."
    
    

    通过把菜单包含在 while 循环中,每次用户选择之后,我们能够让程序重复显示菜单。只要 REPLY 不 等于”0”,循环就会继续,菜单就能显示,从而用户有机会重新选择。每次动作完成之后,会执行一个 sleep 命令,所以在清空屏幕和重新显示菜单之前,程序将会停顿几秒钟,为的是能够看到选项输出结果。 一旦 REPLY 等于“0”,则表示选择了“退出”选项,循环就会终止,程序继续执行 done 语句之后的代码。

    跳出循环

    bash 提供了两个内部命令,它们可以用来在循环内部控制程序流程。这个 break 命令立即终止一个循环, 且程序继续执行循环之后的语句。这个 continue 命令导致程序跳过循环中剩余的语句,且程序继续执行 下一次循环。这里我们看看采用了 break 和 continue 两个命令的 while-menu 程序版本:

    #!/bin/bash
    # while-menu2: a menu driven system information program
    DELAY=3 # Number of seconds to display results
    while true; do
        clear
        cat <<- _EOF_
            Please Select:
            1\. Display System Information
            2\. Display Disk Space
            3\. Display Home Space Utilization
            0\. Quit
        _EOF_
        read -p "Enter selection [0-3] > "
        if [[ $REPLY =~ ^[0-3]$ ]]; then
            if [[ $REPLY == 1 ]]; then
            echo "Hostname: $HOSTNAME"
            uptime
            sleep $DELAY
            continue
        fi
        if [[ $REPLY == 2 ]]; then
            df -h
            sleep $DELAY
            continue
        fi
        if [[ $REPLY == 3 ]]; then
            if [[ $(id -u) -eq 0 ]]; then
                echo "Home Space Utilization (All Users)"
                du -sh /home/*
            else
                echo "Home Space Utilization ($USER)"
                du -sh $HOME
            fi
            sleep $DELAY
            continue
        fi
        if [[ $REPLY == 0 ]]; then
            break
        fi
        else
            echo "Invalid entry."
            sleep $DELAY
        fi
    done
    echo "Program terminated."
    
    

    在这个脚本版本中,我们设置了一个无限循环(就是自己永远不会终止的循环),通过使用 true 命令 为 while 提供一个退出状态。因为 true 的退出状态总是为零,所以循环永远不会终止。这是一个 令人惊讶的通用脚本编程技巧。因为循环自己永远不会结束,所以由程序员在恰当的时候提供某种方法来跳出循环。 此脚本,当选择”0”选项的时候,break 命令被用来退出循环。continue 命令被包含在其它选择动作的末尾, 为的是更加高效执行。通过使用 continue 命令,当一个选项确定后,程序会跳过不需要的代码。例如, 如果选择了选项”1”,则没有理由去测试其它选项。

    until

    这个 until 命令与 while 非常相似,除了当遇到一个非零退出状态的时候, while 退出循环, 而 until 不退出。一个 until 循环会继续执行直到它接受了一个退出状态零。在我们的 while-count 脚本中, 我们继续执行循环直到 count 变量的数值小于或等于5。我们可以得到相同的结果,通过在脚本中使用 until 命令:

    #!/bin/bash
    # until-count: display a series of numbers
    count=1
    until [ $count -gt 5 ]; do
        echo $count
        count=$((count + 1))
    done
    echo "Finished."
    
    

    通过把 test 表达式更改为 $count -gt 5 , until 会在正确的时间终止循环。决定使用 while 循环 还是 until 循环,通常是选择一个 test 可以编写地很清楚的循环。

    使用循环读取文件

    while 和 until 能够处理标准输入。这就可以使用 while 和 until 处理文件。在下面的例子中, 我们将显示在前面章节中使用的 distros.txt 文件的内容:

    #!/bin/bash
    # while-read: read lines from a file
    while read distro version release; do
        printf "Distro: %s\tVersion: %s\tReleased: %s\n" \
            $distro \
            $version \
            $release
    done < distros.txt
    
    

    为了重定向文件到循环中,我们把重定向操作符放置到 done 语句之后。循环将使用 read 从重定向文件中读取 字段。这个 read 命令读取每个文本行之后,将会退出,其退出状态为零,直到到达文件末尾。到时候,它的 退出状态为非零数值,因此终止循环。也有可能把标准输入管道到循环中。

    #!/bin/bash
    # while-read2: read lines from a file
    sort -k 1,1 -k 2n distros.txt | while read distro version release; do
        printf "Distro: %s\tVersion: %s\tReleased: %s\n" \
            $distro \
            $version \
            $release
    done
    
    

    这里我们接受 sort 命令的标准输出,然后显示文本流。然而,因为管道将会在子 shell 中执行 循环,当循环终止的时候,循环中创建的任意变量或赋值的变量都会消失,记住这一点很重要。

    总结

    通过引入循环,和我们之前遇到的分支,子例程和序列,我们已经介绍了程序流程控制的主要类型。 bash 还有一些锦囊妙计,但它们都是关于这些基本概念的完善。

    拓展阅读

    展开全文
  • 电脑故障检查不完全流程图

    千次阅读 2006-10-06 20:28:00
    电脑故障巧判断 从直观表现查找问题根源PC电脑虽然已经步入普及家庭,但与普通的家用电器有着实质性的区别。大家都知道,计算机是多种板卡组装成的,每一个硬件发挥着独自的作用,其中任何一个硬件损坏或罢工,那个...
  • 现在点击运行,然后点击菜单上的开始,可以看到实现了背景的无缝循环滚动功能(如果没实现,可以自己手动测试后修改ProcedureMain显示背景实体时传给BgData的startPosition参数与BgData构造方法里的SpawnTarget等...
  • 先将Glide的一整套图片加载机制的基本流程梳理清楚,然后我们再通过后面的几篇文章具体去了解Glide源码方方面面的细节。 准备好了吗?那么我们现在开始。 源码下载 既然是要阅读Glide的源码,那么我们...
  • 数码管0到9循环显示仿真

    千次阅读 2016-03-11 23:01:11
    源代码: #include void delay(int x); #define SEG P2 void main() {  int i;  char TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ;  while(1)  {   for(i=0;... delay(800)
  • 顺序流程控制:这个是自动的,不加任何控制的流程。 分支流程控制: 单分支 if: 所谓分支控制,就是代码中有了判断的逻辑,根据这个判断的真假来执行不通的代码 if(判断条件){ 语句块 } 双分支:if…else ...
  • 一 三图四六图七 allyesno :现在开始跳楼卖血送修电脑文章 电脑故障巧判断 从直观表现查找问题根源PC电脑虽然已经步入普及家庭,但与普通的家用电器有着实质性的区别。大家都知道,计算机是多种...
  • 系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战和Windows漏洞利用等,...这篇文章将带领大家来学习科锐钱林松老师的视频,详细讲解条件语句和循环语句源码还原及流程控制逆向。希望对入门的同学有帮助。
  • 流程控制:while/until 循环In the previous chapter, we developed a menu-driven program to produce various kindsof system information. The program works, but it still has a significant usabilityproblem....
  • 详解的HashMap1.7扩容死循环

    千次阅读 2020-07-24 11:46:24
    HashMap扩容过程详解一、1.7HashMap扩容死循环1.产生原因二、1.8HashMap扩容流程 一、1.7HashMap扩容死循环 1.产生原因 1.7HashMap在高并发场景下,会发生扩容链表死循环问题! 二、1.8HashMap扩容流程
  • 这是作者安全攻防进阶系列博客,包括恶意样本分析、逆向...这篇文章将继续带领大家来学习科锐钱林松老师在华中科技大学的分享视频,详细讲解条件语句和循环语句源码还原及流程控制逆向。基础性文章,希望对您有所帮助~
  • 单片机——8位数码管循环显示0-7

    千次阅读 2020-04-27 12:09:35
    并且要给A加上一个偏移量8 C语言 思路:分别定义段控、位控数组,直接循环分别赋值 #include #define uchar unsigned char #define uint unsigned int int a[8]={1,2,4,8,16,32,64,128}; //定义位控数组 int b[8]={...
  • 设计一个循环灯控制器,该控制器控制红、绿、黄三个发光管循环发亮。要求红发光亮2秒,绿发光亮3秒,黄发光亮1秒。(假设外部提供频率为1MHz的方波信号)
  • 流程梳理

    万次阅读 2014-04-15 11:06:43
    流程梳理很多CIO和我联系希望我讲讲流程管理、流程和IT结合的事。因为CIO们在推进IT项目时候,不理解业务流程、企业业务流程不清晰、业务流程和IT功能怎么结合使用,这些问题给IT项目的推进带来了很大的阻碍,所以...
  • 【Linux】Linux的管道

    万次阅读 多人点赞 2018-08-14 20:28:25
    管道用循环队列实现,连续传送数据可以不限大小。共享内存每次传递数据大小是固定的; 共享内存可以随机访问被映射文件的任意位置,管道只能顺序读写; 管道可以独立完成数据的传递和通知机制,共享内存需要...
  • kvm启动流程

    千次阅读 2019-07-02 18:11:11
    从本文开始介绍,kvn的启动流程. 启动入口位于j2me_cldc/kvm/VmExtra/src/main.c的main方法.代码如下: int main (int argc, char* argv[]) { int result; #if USE_JAM char *jamInstalledAppsDir = "./instapps"; ...
  • 专栏——TensorFlow学习笔记 ...循环神经网络(Recurrent Neural Network, RNN) 是一种适宜于处理 序列数据 的神经网络,被广泛用于语言模型、文本生成、机器翻译等。基础知识可以看一下这个英文...
  • 一篇文章看明白 Android PackageManagerService 工作流程

    万次阅读 多人点赞 2018-09-19 17:03:01
    一篇文章看明白 Android PackageManagerService 工作流程 一篇文章看明白 Android v1 & v2 签名机制 概述 PackageManagerService(简称 PKMS),是 Android 系统中核心服务之一,管理着所有跟 package 相关...
  • Java流程控制

    千次阅读 2016-05-10 10:40:39
    不论哪一种编程语言,都会提供两种基本的流程控制结构:分支结构和循环结构。 顺序结构 分支结构:if和switch 循环:while、do while、for、嵌套循环 中断循环:break、continue、return
  • pipeline-filter模式变体之尾循环

    千次阅读 2014-10-31 15:17:45
    pipeline-filter作为一种处理数据的模式,可以将应用的任务划分为几个自我完备的数据处理步骤,并连接到一个数据管道。本文介绍一种不太常见的pipeline-filter的变体——尾循环的pipeline-filter.
  • Android Sensor流程

    千次阅读 2016-03-22 22:55:30
    今天公司需要查看各sensor的流程, 一周了要需要和大家分析一下了 进入正题: 首先来看一下sensor的整个流程图
  • Android 7.0 Vold工作流程

    千次阅读 2016-09-12 22:06:16
    为了进一步了解整个Vold进程的主要工作流程,接下来我们分析一下其主要模块的工作流程。 1、NetlinkManager模块 1.1 NetlinkManager的创建和启动 在Vold的main函数中,调用NetlinkManager::Instance创建出...
  • spring源码系列(一)——spring循环引用

    万次阅读 多人点赞 2019-09-30 21:22:06
    spring循环依赖如何解的?
  • 点此查看大 虚幻引擎主循环为LaunchEngineLoop.cpp,LaunchEngineLoop.h LaunchEngineLoop.cpp里面有3000+行代码,包含了整个虚幻引擎生命周期的流程 依.cpp顺序依次看一下 引用库和变量定义 大部分功能的库都...
  • 教具的采购流程(没有发成图片)

    千次阅读 2004-10-25 09:05:00
    但还是没有具体到对流程清晰明白的地步,并且我估计教具的实际购买操作也是千差万别,需要进一步的深入了解。现将收集的资料的作一整理,以后再逐步调整和补充。一、:教育部规定教具管理流程二、相关机构和部门1. ...
  • 是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并...
  • JS中的事件循环原理以及异步执行过程这些知识点对新手来说可能有点难,但是是必须迈过的坎,逃避是解决不了问题的,本篇文章旨在帮你彻底搞懂它们。 说明:本篇文章主要是考虑浏览器环境,Node环境我没有研究过暂时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,813
精华内容 14,725
关键字:

循环管流程图