2018-3-26Linux系统管理(14)bash脚本编程之循环控制语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018-3-26Linux系统管理(14)bash脚本编程之循环控制语句相关的知识,希望对你有一定的参考价值。

  我们在上个章节中讲到了如何使用yum来实现所谓的程序包管理,对于yum而言,它只是rpm包的一个前段管理工具,并不是取代rpm后端管理工具,它只是提供了较好的、基于仓库的、完成元数据自动分析以及依赖关系自动分析及自动解决的这么一个工具,但是强依赖于yum仓库的存在,但是yum的工作架构为C/S架构,首先,对于需要安装某个程序软件来讲,我们就称之为客户端(yum client),而我们管理程序包所使用的命令为yum命令。而服务器端并不是yum服务器端,但我们可以称之为yum的仓库端(yum repository),yum的仓库端需要提供一种文件共享服务,将其yum仓库的程序包让客户端能够访问到,这其中在C/S架构模型当中经常用到的协无非就是ftp/http/https,那也就意味着,实际上yum工作时,每一个客户端主机都需要有yum命令,其次还需要提供其配置文件,可提供多个以.repo结尾放置在/etc/yum.repos.d/目录下,也是片段性文件。

  每一个.repo结尾的文件就可以定义一个yum的指向,但也可以定义多个,那么我们对于以上的总结及yum的语法格式做出简单赘述:

   回顾:yum程序包管理器和编译安装
        C/S
          yum client(yum)
          yum repository(ftp/http/https)
       
        base
        extras
        updates
    
        repo:
           [id]
           name=
           baseurl=http://
                   http://

  但需要注意的是,对于CentOS任何一个发行版来讲,至少有一个源叫base源,我们在安装操作系统时,不可能将所有的软件包将其安装,要想安装额外的安装包时,可以将光盘制作成为yum仓库,而那个仓库就是一个base仓库,所以无论是阿里云还是清华镜像等站点,通常在os目录下就有base源,但除了base源还有extrasupdates。无论是那个发行版,将光盘作为一个最基本的仓库来安装程序包,剩余则都是补充而已。

  yum的各种管理机制就是通过其各种子命令来完成的,我们来简单阐述并加以总结:

   子命令:
        yum的各种管理机制是由各种子命令形成的
        list, clean, makecache, grouplist, info, whatprovides
        install, update, remove, groupinstall, groupupdate, groupremove, groupinfo

  以上就是总结的yum程序包的管理,而后我们也讲到过如何用源码包进行安装该程序,而编译安装其实也是一种非常重要的能力,其主要讲的还是C/C++编译上的安装,使用的为大致标准三个步骤,第一个是configure这是系统编译安装检查脚本,并且编译安装符合条件之后还能结合Makefile.in,生成makefile文件,而第二步就是使用make结合makefile编译的配置文件来编译执行makefile,而编译完成之后,无论是二进制还是库文件程序以及配置文件等,都依然准备完成,而后使用make install复制到在configure指定的安装路径中去,生成相应的文件目录,将文件依次归类存放运用。

   编译安装:
      C/C++:
          ./confiure --> makefile.in ==> makefile
              make + makefile ==> binary, library, configfile, manual
              make install

  那么在这一章当中,继续讲解bash脚本的内容。

一、bash脚本编程之if语句

  此前我们也讲过,一个过程式编程语言的执行流程大致分为三类:

   过程式编程语言的执行流程:
        顺序执行
        选择执行
        循环执行

  回顾我们此前讲到的选择执行,选择执行可以有两种方式来实现,第一种&&以及||,这是最常用的两种机制,第二种是if语句,其实还有第三种为case语句。

   选择执行:
        (1) &&, ||
        (2) if语句
        (3) case语句

  那么if语句其实是有三种格式,我们讲了其中的两种,第一种为单分支的if语句,为真执行该语句,为假则不执行该语句,另一种为双分支的if语句,那么之所以叫选择分支就因为它是布尔型的条件,以此结果就带来要么为真,要么为假,为真时执行该分支,为假时执行另一个该分支,所以叫做选择执行,那么第三种就是多分支的if语句,这种是在当有n种可能时,我们都需要做一下测试,所以当我们的条件不止有真假时,而是有多个选择时,可以满足多个测试时可将其应用。否则,所有的条件都不满足时,我们才能执行无法识别的语句等。那么无论是单分支或双分支以及多分支语句的格式为:

   if语句:三种格式
        单分支的if语句
           if CONDITION; then
               if-true-分支
           fi
        
        双分支的if语句
           if CONDITON1; then
               if-true-分支
           else
               if-false-分支
           fi
    
        多分支的if语句
           if CONDITION1; then
               条件1为真分支
           elif CONDITION2; then
               条件2为真分支
           elif CONDITION3; then
               条件3为真分支
           ... ...
           elif CONDITIONn; then
               条件n为真分支
           else
               所有条件均不满足时分支
           fi

  需要注意的是,多个CONDITION条件如果不互斥的话,多个条件满足也是存在的,但在这里的分支只能是执行其中一个,会执行首先测试为"真"的一个。如果该条件为真时,则后续条件不用测试,如果条件都不为真时,则执行else分支。

   注意:即便多个条件可能同时都能满足,分支只会执行其中一个,首先测试为"真";

  练习:让用户通过脚本参数传递一个文件路径给脚本进行判断其类型。

#!/bin/bash
#

[ -z "$1" ] && echo "Please input filename or directory address" && exit 2
[ $# -lt 1 ] && echo "At lease on path" 
[ ! -e "$1" ] && echo "No Such File!" && exit 3

if [ -d "$1" ]; then
	echo "This is Directory!"

elif [ -f "$1" ]; then
	echo "This is a Commin Files!"

elif [ -L "$1" ]; then
	echo "This is a Link Files."

elif [ -b "$1" ]; then
	echo "This is Block Files!"

elif [ -c "$1" ]; then
	echo "This is Charactor Files!"

elif [ -S "$1" ]; then
	echo "This is a Socket Files."

else
	echo "Unknown Files or Directory!"

fi

  测试或者选择语句还有第三种语句,叫做case语句,其实case语句就是简化版的多分支语句,用于实现简化版的多分支if,但未必每个多分支的if语句都能写成case语句,还有就是if语句其实是可以嵌套的,也就是说,if中可以继续使用if,还可以包含其它执行语句。

   注意:if语句可嵌套

二、bash脚本之循环语句

  所谓循环执行我们此前讲过,无非就是将一段代码重复执行n次,能够实行将一段代码重复实行n次,需要注意的是,要实行循环时,就要指定其循环次数,我们要想办法控制其循环次数,不然的话则无法退出,变成死循环,当然也有些场合是需要实行死循环。

  对于循环来说有两个关键要点,一种就是进入条件,就是什么时候开始循环,另一种就是退出条件,而这两点非常重要。所谓进入条件指的是,当程序执行到循环体时,判断是否能够执行以及是否能够执行,要取决于记录条件。

   循环执行:将一段代码重复执行0次、1次或多次;
       进入条件:条件满足时则进入循环;
       退出条件:每个条件都应该有退出条件,以有机会退出循环;

  对于bash脚本来讲,共有三种循环方式,分别为:

   bash脚本:
       for循环
       while循环
       until循环

  后两者没有太大的区别,除了进入条件相反。

2.1 for循环

  对于for循环来说,将列表中的每个元素依次赋值给VARIABLE中进行遍历执行循环体即可,for循环共有两种格式。

   for循环:
        两种格式:
            (1) 遍历列表
            (2) 控制变量

  我们先说第一种,通过遍历列表的格式,则for循环遍历语法格式为:

   遍历列表:
       for VARIABLE in LIST; do
           循环体
       done

  那么for循环的进入条件和退出条件为:

   进入条件:只要列表有元素,即可进入循环;
   退出循环:列表中的元素遍历完成;

  例如:创建是个文件,从f1-f10。

#!/bin/bash
#

for i in 1 2 3 4 5 6 7 8 9 10; do
    touch /tmp/f$1
done

  当然如果要是这样创建100个文件的话,确实是一件非常麻烦的事情,另外一个,不能直接使用touch命令,很有可能是会更改时间戳的,真正创建文件时,应该判断是否存在,如果不存在则创建,存在的话则更改一下时间戳而已。所以说一定要注意该命令实现什么功能,是否有其幂等性,每个循环当中的幂等是能够重复执行的,幂等执行可允不允许重复执行,即使不重复执行时,哪怕只执行一次,也得有个意外条件,所以说判断至关重要。

  那么LIST的生成方式有很多中,刚才给出的示例也是其中一种,那么我们现在对于LIST的生成方式做一下简单的阐述:

   LIST生成方式:
       (1) 直接给出;
       (2) 整数列表
           (a) {start..end}
           (b) seq [start [incremtal]] last
    
       (3) 返回列表的指令;
       (4) glob;
       (5) 变量引用
           [email protected], $#
    
       ... ...


以上是关于2018-3-26Linux系统管理(14)bash脚本编程之循环控制语句的主要内容,如果未能解决你的问题,请参考以下文章

2018.3.26 14周1次课

2018-3-26 14周1次课 NFS服务端安装配置

Linux系统管理14——磁盘配额(Quota)

2018-3-14Linux系统管理(12) Linux程序包管理yum前端管理工具

第14章 Linux启动管理_系统修复模式

小胖学Linux day14:用户管理