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], $#
    
       ... ...

原文地址:http://blog.51cto.com/tianxie/2091968

时间: 2024-08-27 10:08:15

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

shell脚本编程之循环控制语句(continue/break/sleep)

循环控制语句: continue:提前结束本轮循环,而直接进入下一轮循环判断: while  CONDITION1; do CMD1 ... if  CONDITION2; then continue fi CMDn ... done 示例:求100以内所有偶数之和: #!/bin/bash # declare -i evensum=0 declare -i i=0 while [ $i -le 100 ]; do     let i++     if [ $[$i%2] -eq 1 ]; th

压缩工具及bash脚本编程

回顾: RAID: 不同的服务器配置起来他的借口可能配置起来有所不同,但是官方一般都提供响应的说明书,按照说明书进行配置就行.关键是理解RAID级别的机制的意义是什么 LVM: 其实是一个逻辑设备他存在的主要作用是提供卷管理操作,我们称之为"volume", 卷管理操作的目的主要是实现把一个或多个底层的物理设备给组织成一个逻辑设备,我们可以将底层的任何类型的块设备,包括我们常见的基本磁盘分区,或者甚至是RAID都OK,只要他们提供块级别的存储空间,但是考虑到任何单个硬件设备他们的边界都

bash脚本编程的语法知识点总结第一部分

bash脚本编程的所有语法知识点总结第一部分 名词概念 bash脚本编程,从字面意思理解也就是shell脚本编程.bash应该是目前Linux上最流行的shell脚本解释程序.shell是一个命令语言解释器,而shell脚本则是Linux命令的集合,按照预设的顺序依次解释执行,来完成特定的.较复杂的系统管理任务,类似于Windows中的批处理文件. 1.shell脚本格式 第一行,顶格. eg: #!/bin/bash #!/usr/bin/python 其它的以#开头的行均为注释,会被解释器忽

bash脚本编程知识储备

bash脚本编程: ????脚本程序:解释器解释执行: 首先得理清一些琐碎的知识点,我尽量把我所学的帮朋友一起梳理一下 编程环境:(我会在接下来的篇章,图文例子三结合的方式带大家一起学习) ???????????? 流程控制语句: ???????????????? 顺序执行: ???????????? 循环执行: ???????????????? 选择执行: 2. ????????bash变量是弱类型:默认字符型: ? ????????变量引用:${VAR_NAME} ????????引号: ?

高级Bash脚本编程指南

http://tldp.org/LDP/abs/html/ 高级Bash脚本编程指南对脚本语言艺术的深入探索 本教程不承担以前的脚本或编程知识,但进展迅速走向一个中级/高级水平的指令...一直偷偷在细小的UNIX®智慧和学识.它作为一本教科书,一本手册,自学,并作为一个参考和知识的来源,壳牌的脚本技术.练习和大量的评论实例请读者参与,在这样的前提下,真正学习脚本的唯一途径是编写脚本.这本书是适合课堂使用的一般介绍编程的概念.本文件被授予公共领域.没有版权! 奉献对于安妮塔,所有魔术的来源内容表第

bash脚本编程之条件判断、条件测试

脚本编程: 编程面向过程有如下几种执行方式 顺序执行 选择执行:  如 if, case 循环执行:  如 for, while, until bash的变量类型: 本地变量 set VAR_NAME=value 设置变量赋值 如: set User=Centos unset VAR_NAME 撤消变量赋值 如: unset User=Centos ${VAR_NAME} 作用范围:当前shell进程: 局部变量 local VAR_NAME=value 设置变量赋值 unset VAR_NAM

bash脚本编程之变量、变量类型、条件测试、算术运算、及特殊变量

一.学习目的 1.了解bash脚本的变量类型及变量的使用 2.了解bash中条件测试的种类及如何在bash中实现条件的判断 3.学会在bash中做算术运算 4.了解特殊变量的使用 二.学习内容 1). ①.bash的变量类型: 环境变量 .本地变量.局部变量.位置变量.特殊变量 环境变量: export VALUENAME = VALUE 作用领域是当前的shell进程及其子进程 本地变量: VALUENAME= VALUE 作用领域为整个bash的进程 局部变量:local VALUENAME

《高级Bash脚本编程指南》十年来首次修订

新年伊始,开源慕课的知识库上线了.初期提供了<Linux命令大全/Bash 参考><高级Bash脚本编程指南>两个系列.其他资料正将陆续上线. 其中,<高级Bash脚本编程指南>对于Shell学习者来说,是一本神一样的书籍. 它的原作者是Mendel Cooper,英文名叫<Advanced Bash-Scripting Guide>发表在http://tldp.org/ 上,是一本免费的书籍. 有人说,学习Unix/Linux,有座山叫shell编程,你总

bash脚本编程之用户交互

bash脚本编程之用户交互: read [option]... [name ...] -p 'PROMPT'    读取输入的内容 -t TIMEOUT    超时时间,如果超过了该时间,继续执行下面代码 bash -n /path/to/some_script 检测脚本中的语法错误 bash -x /path/to/some_script 调试执行 示例: 输入一个磁盘文件信息,使用fdisk -l显示该磁盘信息 #!/bin/bash read -p "Enter a disk specia