shell脚本的各种循环

For循环

For循环格式

     For   变量名  in    列表    ;   do

           循环体

     Done

执行机制:

依次将列表中的元素赋值给变量名,每次赋值后即执行一次循环体,知道列表中的元素耗尽,循环结束。

列表中可以是各种各样的空格隔开的字符,数字,单词都可以,列表中有多少个字符,将执行多少遍循环。在执行循环的时候,第一次执行循环,将匹配列表中的第一个值,比如说列表中有a b c d四个字母,当第一次执行循环的时,这个变量的值将等于a。循环体可以执行很多指令。

例如:

blob.png 

列表生成方式:

(1)整数列表:

              {1..10}  生成1到10的数   但是不可以加变量

              Seq 1  10  生成1到10的数  可以加变量

              步进 seq 1 2 10   每次加2进行递增

            blob.png

由于seq是命令,在for循环里要调用命令,即命令调命令,需要用反向单引号包住。

  eg:for id in `seq  1  10`,也可以用$()。

(2)返回列表命令

           $(COMMAND)

(3)使用glob  如:“*.sh”

       例如:#!/bin/bash

               For file in  /root/bin/*.sh

               匹配该路径下所有是.sh结尾的文件

               do

               echo “the filename is $file”

 

(4)变量引用    $*  $@

           $* 和$@的区别

新建脚本test.sh

blob.png 

执行结果

blob.png 

$*将a  b  c看成了一个独立的整体。

新建脚本test2.sh

blob.png 

执行结果

blob.png 

$@将a  b  c看成了三个独立的字符串。

但是,这只是将$@  $*用引号引起来才有区别,不用引号则二者都将a  b  c看成三个独立的字符串,没有区别。

While循环

通用性更好,适合范围广

While格式:

        While  CONDITION ; do

        循环体

Done

COMDITTON:循环控制条件,进入循环之前,先做一次判断,每一次循环之后再做一次判断,条件为true,则执行一次循环。直到条件测试状态为“false”终止循环。

因此,COMDITION一般应该有循环控制变量。而此变量的值会在循环体不断的被修正。

进入条件:CONDITION为 true

退出条件:CONDITION为 false

COMDITION不仅是执行循环的条件,也是进入循环的条件。

 

例如:

blob.png 

执行结果

blob.png 

先判断10是否大于1,大于1则打印“da yu 1”并10-1=9再进入循环,直到等于1则退出循环。

Until循环

格式:

    Until  CONDITION  ;  do

    循环体

Done

进入条件:CONDITION为false

退出条件;CONDITION为true

    先判断CONDITION是否为真,如果为真,则退出循环,如果CINDITION为假,才

才进入循环体,执行完循环体,再判断CONDITION是否为假,如果为假,则再进入循

环体,直到条件结果为真时,才退出循环。

例如:

blob.png 

执行结果

blob.png 

当i=10小于1条件为假时,进入循环,并输出‘da yu 1’,并10-1=9继续进入循环。直到结果等于1时,循环结束,输出yyy。

循环控制语句

  Continue[N]:提前结束第N层的本轮循环,而直接进入下一轮循环判断,最内层为第一层。Continue是退出当次循环。

例如:

blob.png 

当10小于1为假时,进入循环,10除以2余数为0且余数不等于1,为假,则打印$i也就是10。然后10-1=9进入循环。9除以2余数为1且余数等于1,为真。则执行9-1,并退出本次循环,进入下一次循环,依次类推,直到$i小于1为真时,退出循环,并打印yyy。

 

 

Break[N]提前结束第N层循环,break是退出整个循环,例如:

shell脚本的各种循环blob.png 

执行结果:

blob.png 

当10小于1为假时,进入循环,10的余数是0,不等于1,为假。将10打印输出并减1进入下一轮循环。9小于1为假时,进入循环,9的余数是1,为真,则break退出整个循环,并打印yyy。

While的特殊用法

遍历文件的每一行。

While  read  line ;do

       循环体

Done  < /PATH/FROM/SOMEFILE

依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line。

例如:

blob.png 

这是一个死循环。

 

 

例如:while read passwd ; do echo $passwd |cut -d: -f1,3;done < /etc/passwd

输入一个变量$passwd。当每次读一个文件进来后,每一行的内容就赋值给了$passwd这个变量,并将取出的行显示出来。以“:”作为分隔符,取出其第一列和第三列,然后重定向输出给/etc/passwd。是一行一行处理的,读一行打印一遍。

双小括号的特殊用法 ((…….))

双小括号方法,即((……..))格式,也可以用来算数运算,双小括号也可以使用bash shell实现c语言风格的变量操作。

#i=10

#((i++))

例如:

blob.png 

For循环的特殊格式

for((控制变量初始化;条件判断表达式;控制变量的修正表达式))

do

                 循环体

Done

控制变量初始化:仅在运行到循环代码段时执行一次,只执行一次。

控制变量的修正表达式:每轮循环结束,会先进行控制变量的修正运算,然后再条件判断。

例如:

For  ((cmd1;cmd2;cmd3))

Do

Cmd4

Done

    先执行cmd1(不管真假),执行完后再执行cmd2,判断cmd2是否为真,为真则执行cmd4,如果为假,则退出循环。

    Cmd4执行完后接着执行cmd3。执行完cmd3后,接着执行cmd2,判断cmd2的

真假,为真则继续循环。

    Cmd1只执行一次,作为for循环的初始化语句,若cmd1为假,则退出。

    Cmd2才是进入循环和退出循环的判断条件,cmd3和cmd4只是执行,不管真假。

例如:

blob.png 

执行结果 :6

Select循环与菜单case

格式:

    Select  variable  in  list

        Do

              循环体命令

        Done

Select循环主要用来创建菜单。按数字顺序排列的菜单项将显示在标准错误伤,并显示PS3提示符,等待用户输入。

用户输入菜单列表中的某个数字,将执行相应的命令。

用户输入被保存在内置变量ERPLY中。

例如:

blob.png 

执行结果

blob.png 

Select是个无限循环,因此要记住使用break命令退出循环,或用exit命令终止脚本,也可以按Ctrl+C退出循环。

Select经常和case联合使用。

与for循环类似,可以省略in  list,此时使用位置变量。例如:$1  $2  $3

 

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

赞 (1)
zzdzzd
上一篇 2016-08-21 20:46
下一篇 2016-08-21 20:46

相关推荐

  • RAID磁盘阵列

    什么是RAID?    RIAD(Redundant Array of Independent Disk,独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失效时不会使对数据的访问受损失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价磁盘构成的冗余阵列,在操作系统下是作为一个独立的大…

    Linux干货 2016-12-13
  • 网络管理

    说起网络,大家都不陌生,因为大家天天上网嘛,连路边老大爷都会聊微信了,但是我们所了解的网络只是茫茫网络大海中的一叶扁舟,网络的范围其实有很大,里面涉及的东西也非常多,现在让小编带你一点一点去了解它吧,相信大家看了之后,会有不一样的体会呢! 1、 什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系。在数学上,网络是一种图,一般认为专指加权图。网络除…

    2017-09-02
  • 马哥教育网络班22期+第9周课程练习 忍者乱太郎喻成

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash declare -i user_can_not_login_count; declare -i user_can_login…

    Linux干货 2017-01-03
  • 数组

    数组 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合 数组名和索引 索引:编号从0开始,属于数值索引 注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引, 八十的数组支持稀疏格式(索引不连续 声明数组: Declare -a ARRAY_NAME Declare -A ARRAY_NAME:关联数组 注意…

    Linux干货 2018-01-02
  • if、case 语法

    1. 条件选择 if 语句         选择执行:              单分支      &nbs…

    Linux干货 2016-08-22
  • Linux中的cut、sort、uniq以及用户(组)管理类指令应用示例

    Linux中的cut、sort、uniq指令 列出当前系统上所有已经登录的用户的用户名,注意:同一用户登录多次,只显示一次。 解决思路: 先使用who指令显示出所有已登录的用户。然后对who指令的输出进行切割得到想要的第一列内容,即只包含用户名。可以使用cut指令。最后对cut的结果进行排序并去重。可以使用sort指令。   借助管道符,可以方便的…

    Linux干货 2016-11-13

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-21 23:12

    文章对shell循环语句的语法总结的很好,同时也通过简单的练习加深了自己与各语法的运用,课堂练习都是老师精心挑选出来的,也是笔试中常会遇到的经典试题,需要认真完成哦。