Shell脚本中循环浅析

shell脚本中,循环是很重要的一环。循环可以不断的执行某个程序段落,直到用户设置的条件达成为止。在shell中,除了这种依据判断时达成与否的不定循环之外,还有另外一种已经固定要跑多少次的循环,可称之为固定循环。下面,我们主要对forwhileuntil三种循环做一下介绍。

 

一、for循环

For循环是给定变量列表的固定次数循环,其执行机制为依次将列表中的元素赋值给“变量名”,每次赋值后即执行一次循环体,直到列表中的元素耗尽,循环结束。其基本语法如下:

for 变量名 in 变量列表;do

循环体

Done

由于是固定次数循环,而其循环次数是由变量列表所决定的,那么对于变量列表,其生成方式主要有以下几种:

Ø  直接给出列表

Ø  整数列表

    {m..n}

    ${seq m n}

Ø  返回列表的命令; $(COMMAND)

Ø  使用glob,如:*.sh

Ø  变量引用:$@,$*

其中,对于整数型的变量列表,shell同样提供了类似于C语言的for循环风格,其语法为:

for ((初始值;限制值;执行步长));do

程序段

done

这种语法适合于数值方式的运算当中,在for后面的括号内的三串内容意义为:

Ø  初始值:某个变量在循环当中的初始值,直接以类似i=1设置;

Ø  限制值:当变量的值在这个限制值的范围内,就继续进行循环,例如i<=100

Ø  执行步长:每做一次循环时变量的变化量,如:i=i+1

对于此种语法,其执行顺序为:初始值à限制值à程序段à执行步长à限制值。如此就形成了一个循环,直至变量超过限制值时结束循环。

下面我们利用for循环的两种语法分别打印九九乘法表。

首先我们用标准型for循环语法来编写脚本。

    #!/bin/bash    
    for i in {1..9};do
        for j in $(seq $i);do
            num=$[j*i]
            echo -ne "$i*$i=$num\t"
        done
        echo
    done

然后我们用C语言风格的for循环语法来编写脚本。

    #!/bin/bash    
    for ((i=1;i<=9;i++));do
        for ((j=1;j<=i;j++));do
            num=$[j*i]
            echo -ne "$j*$i=$num\t"
        done
        echo
    done

 

二、while循环

While循环是一种条件判断循环,只要满足设置的条件,就会执行相应的命令。其常用的基本语法如下。

while CONDITION; do

循环体

done

其中CONDITION为循环控制条件,进入循环之前,先做一次判断,每一次循环之后会再次做判断;若条件判断为“true”,则执行一次循环;直到条件判断为“false”,则终止循环;因此,CONDITION一般应该有循环控制变量,而此变量的值会在循环体不断的被修正。

下面我们以while循环来打印一下九九乘法表。

    #!/bin/bash    
    i=1                                        #循环控制变量
    while [ $i -le 9 ];do
       j=1                                  #循环控制变量
       while [ $j -le $i ];do 
          num=$[j*i]
          echo -ne "$j*$i=$num\t"
          j=$((j+1))                        #循环控制变量的值在循环体内不断被修正
       done 
       echo 
       i=$((i+1))                            #循环控制变量的值在循环体内不断被修正
    done

 

三、until循环

Until循环同样是一种条件判断循环,只要不满足设置的条件,就会执行相应的命令,其常用语法如下。

until CONDITION; do

循环体

done

其中CONDITION为循环控制条件,进入循环之前,先做一次判断,每一次循环之后会再次做判断;若条件判断为“false”,则执行一次循环;直到条件判断为“true”,则终止循环;因此,CONDITION一般应该有循环控制变量,而此变量的值会在循环体不断的被修正。

下面我们以until循环来打印一下九九乘法表。

    #!/bin/bash    
    i=1                                        #循环控制变量
    until [ $i -gt 9 ];do
        j=1                                  #循环控制变量
        until [ $j -gt $i ];do
            num=$[j*i]
            echo -ne "$j*$i=$num\t"
            j=$((j+1))                     #循环控制变量的值在循环体中不断被修正
        done
        echo
        i=$((i+1))                           #循环控制变量的值在循环体中不断被修正
    done

原创文章,作者:luoliumeng,如若转载,请注明出处:http://www.178linux.com/38241

(0)
luoliumengluoliumeng
上一篇 2016-08-21
下一篇 2016-08-21

相关推荐

  • Shell脚本编程基础中() (()) [ ] [[ ]] 的使用

    Shell脚本编程基础中() (()) [ ] [[ ]] 的使用 () 生成子进程,括号内的命令将会在子进程中运行,父进程不能够读取在子进程中创建的变量 例: 新建个脚本文件,写入 则执行结果为 $()相当于 ` `  ,返回括号内命令执行结果 (( )) 用作四则运算和逻辑运算,并且支持多个表达式 例: 当 (( )) 加$,则是将获得表达式值,赋值给左…

    2017-11-26
  • 如何在微软云上搭建mysql主从

    大家好: 今天我分享下在生产环境的微软云服务器上如何搭建mysql主从: 环境如下图: 我把cnux06-testing设为Mysql主服务器,暂时没需求的cnux04-web1db2设为Mysql从服务器 1–首先要在master上开启binlog日志功能并使主从库中的 server-id保持不同 操作步骤如下: A: 先查看mysql的主目录…

    Linux干货 2017-02-14
  • 创建CA 和申请证书

    创建CA 和申请证书1生成私有CA的私钥:(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)注:CA的私钥文件必须放在/etc/pki/CA/private/cakey.pem 这个路径里2创建序列号 ,数据库文件touch  /etc/pki/CA/index.tx…

    Linux干货 2017-07-17
  • 计算机网络基础

    计算机网络基础 分层的网络模型 网络发展到今天,规模很庞大,内容很复杂,不利于网络的管理和教学。网络分层可以:降低网络结构的复杂性、把各层的接口标准化、简化模块设计、确保技术的互操作性、加快发展速度以及简化教学过程。 OSI模型——国际标准:根据国际标准化组织( ISO,International Standards Orgnization)提案,计算机网络…

    Linux干货 2016-11-22
  • 第二周liunx小总结

    第二周liunx小总结 1.“>” ;”>>”   “>” 把STDOUT重定向到文件    “2>”把STDERR重定向到文件   “&>” 把所有输出重定向到文件* >文件内容会覆盖    set -C: 禁止将内容…

    2017-07-20
  • class12 shell编程(四)软件包管理(二)

    一、shell编程(四) 1、循环特殊用法 while 循环的特殊用法(遍历文件的每一行): while read line; do       循环体   done < /PATH/FROM/SOMEFILE 依次读取/P…

    Linux干货 2016-08-24