一、简介


  Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for、while和until。while循环和for循环属于“当型循环”,而until属于“直到型循环”。循环控制符:break和continue控制流程转向。

二、详解


1、for循环

  for循环有三种结构:一种是列表for循环,第二种是不带列表for循环。第三种是类C风格的for循环。

  1、列表for循环

  1. #!/bin/bash
  2. for varible1 in {..}
  3. #for varible1 in
  4. do
  5. echo "Hello, Welcome $varible1 times "
  6. done
  • do和done之间的命令称为循环体,执行次数和list列表中常数或字符串的个数相同。for循环,首先将in后list列表的第一个常数或字符串赋值给循环变量,然后执行循环体,以此执行list,最后执行done命令后的命令序列。
  • Sheel支持列表for循环使用略写的计数方式,1~5的范围用{1..5}表示(大括号不能去掉,否则会当作一个字符串处理)。
  • Sheel中还支持按规定的步数进行跳跃的方式实现列表for循环,例如计算1~100内所有的奇数之和。
  1. #!/bin/bash
  2. sum=
  3. for i in {....}
  4. do
  5. let "sum+=i"
  6. done
  7. echo "sum=$sum"
  • 通过i的按步数2不断递增,计算sum值为2500。同样可以使用seq命令实现按2递增来计算1~100内的所有奇数之和,for i in $(seq 1 2 100),seq表示起始数为1,跳跃的步数为2,结束条件值为100。
  • for循环对字符串进行操作,例如通过for循环显示当前目录下所有的文件。
  1. #!/bin/bash
  2. for file in $( ls )
  3. #for file in *
  4. do
  5. echo "file: $file"
  6. done

  也可一使用for file in *,通配符*产生文件名扩展,匹配当前目录下的所有文件。

  • for通过命令行来传递脚本中for循环列表参数
  1. #!/bin/bash
  2. echo "number of arguments is $#"
  3. echo "What you input is: "
  4. for argument in "$@"
  5. do
  6. echo "$argument"
  7. done

  $#表示参数的个数,$@表示参数列表而$*则把所有的参数当作一个字符串显示。

  2、不带列表for循环

  由用户制定参数和参数的个数,与上述的for循环列表参数功能相同。

  1. #!/bin/bash
  2. echo "number of arguments is $#"
  3. echo "What you input is: "
  4. for argument
  5. do
  6. echo "$argument"
  7. done

  比上述代码少了$@参数列表,$*参数字符串。

  3、类C风格的for循环,也被称为计次循环

  1. #!/bin/bash
  2. for((integer = ; integer <= ; integer++))
  3. do
  4. echo "$integer"
  5. done

  for中第一个表达式(integer = 1)是循环变量赋初值的语句,第二个表达式(integer <= 5)决定是否进行循环的表达式,退出状态为非0时将退出for循环执行done后的命令(与C中的for循环条件是刚好相反的)。第三个表达式(integer++)用于改变循环变量的语句。

Sheel中不运行使用非整数类型的数作为循环变量,循环条件被忽略则默认的退出状态是0,for((;;))为死循环。

  类C的for循环计算1~100内所有的奇数之和。

  1. #!/bin/bash
  2. sum=
  3. for(( i = ; i <= ; i = i + ))
  4. do
  5. let "sum += i"
  6. done
  7. echo "sum=$sum"

2、while循环

  也称为前测试循环语句,重复次数是利用一个条件来控制是否继续重复执行这个语句。为了避免死循环,必须保证循环体中包含循环出口条件即表达式存在退出状态为非0的情况。

  1、计数器控制的while循环

  1. #!/bin/bash
  2. sum=
  3. i=
  4. while(( i <= ))
  5. do
  6. let "sum+=i"
  7. let "i += 2"
  8. done
  9. echo "sum=$sum"

  指定了循环的次数500,初始化计数器值为1,不断测试循环条件i是否小于等于100。在循环条件中设置了计数器加2来计算1~100内所有的奇数之和。

  2、结束标记控制的while循环

  设置一个特殊的数据值(结束标记)来结束while循环。

  1. #!/bin/bash
  2.  
  3. echo "Please input the num(1-10) "
  4. read num
  5. while [[ "$num" != ]]
  6. do
  7. if [ "$num" -lt ]
  8. then
  9. echo "Too small. Try again!"
  10. read num
  11. elif [ "$num" -gt ]
  12. then
  13. echo "To high. Try again"
  14. read num
  15. else
  16. exit
  17. fi
  18. done
  19.  
  20. echo "Congratulation, you are right! "

  结果:

  1. houdembp:shell-home xxx$ sh for.sh
  2. Please input the num(-)
  3.  
  4. To high. Try again
  5.  
  6. Too small. Try again!
  7.  
  8. To high. Try again
  9.  
  10. To high. Try again
  11.  
  12. Too small. Try again!
  13.  
  14. Congratulation, you are right!

  例:通过结束标记控制实现阶乘的操作。

  1. #!/bin/bash
  2. echo "Please input the num "
  3. read num
  4. factorial=
  5. while [ "$num" -gt ]
  6. do
  7. let "factorial= factorial*num"
  8. let "num--"
  9. done
  10.  
  11. echo "The factorial is $factorial"

  3、标志控制的while循环

  使用用户输入的标志值来控制循环的结束(避免不知道循环结束标志的条件)。

  1. #!/bin/bash
  2.  
  3. echo "Please input the num "
  4. read num
  5. sum=
  6. i=
  7. signal=
  8. while [[ "$signal" -ne ]]
  9. do
  10. if [ "$i" -eq "$num" ]
  11. then
  12. let "signal=1"
  13. let "sum+=i"
  14. echo "1+2+...+$num=$sum"
  15. else
  16. let "sum=sum+i"
  17. let "i++"
  18. fi
  19. done

  标志控制的while循环求1~n的累加和,循环变量值小于100执行else累加同时循环变量加1,直到循环变量值等于100将标志值设置为1,并输出。

标志控制的while循环与结束标记控制的while循环的区别是用户无法确定无法确定结束标志,只能程序运行后确定结束标志。两者也可以相互转化。

  4、命令行控制的while循环
      使用命令行来指定输出参数和参数个数,通常与shift结合使用,shift命令使位置变量下移一位($2代替$1、$3代替$2,并使$#变量递减),当最后一个参数显示给用户,$#会等于0,$*也等于空。

  1. #!/bin/bash
  2. echo "number of arguments is $#"
  3. echo "What you input is: "
  4. while [[ "$*" != "" ]]
  5. do
  6. echo "$1"
  7. shift
  8. done

  循环条件可以改写为while[[ "$#" -ne 0 ]],等于0时退出while循环。

3、until循环

  until命令和while命令类似,while能实现的脚本until同样也可以实现,但区别是until循环的退出状态是不为0,退出状态是为0(与while刚好相反),即whie循环在条件为真时继续执行循环而until则在条件为假时执行循环。

  1. #!/bin/bash
  2. i=
  3. until [[ "$i" -gt ]] #大于5
  4. do
  5. let "square=i*i"
  6. echo "$i * $i = $square"
  7. let "i++"
  8. done

  结果:

  1. houdembp:shell-home xxx$ sh for.sh
  2. * =
  3. * =
  4. * =
  5. * =
  6. * =
  7. * =

4、循环嵌套

  一个循环体内又包含另一个完整的循环结构,在外部循环的每次执行过程中都会触发内部循环,for、while、until可以相互嵌套。

  1、嵌套循环实现九九乘法表

  1. #!/bin/bash
  2. for (( i = ; i <=; i++ ))
  3. do
  4.  
  5. for (( j=; j <= i; j++ ))
  6. do
  7. let "temp = i * j"
  8. echo -n "$i*$j=$temp "
  9. done
  10. echo "" #output newline
  11. done

  2、for循环嵌套实现*图案排列

  1. #!/bin/bash
  2. for ((i=; i <= ; i++))
  3. do
  4. j=;
  5. while ((j > i))
  6. do
  7. echo -n " "
  8. let "j--"
  9. done
  10. k=
  11. while ((k <= i))
  12. do
  13. echo -n "*"
  14. let "k++"
  15. done
  16. echo ""
  17. done

  外层for循环嵌套了两个内层while循环,先打印空格在打印*号形成图案。

5、循环控制符break和continue

  若须退出循环可使用break循环控制符,若退出本次循环执行后继续循环可使用continue循环控制符。

  1、break

  在for、while和until循环中break可强行退出循环,break语句仅能退出当前的循环,如果是两层循环嵌套,则需要在外层循环中使用break。

  1. #!/bin/bash
  2. sum=
  3. for (( i=; i <= ; i++))
  4. do
  5. let "sum+=i"
  6.  
  7. if [ "$sum" -gt ]
  8. then
  9. echo "1+2+...+$i=$sum"
  10. break
  11. fi
  12. done

  2、continue

  在for、while和until中用于让脚本跳过其后面的语句,执行下一次循环。continue用于显示100内能被7整除的数。

  1. #!/bin/bash
  2. m=
  3. for (( i=; i < ; i++ ))
  4. do
  5. let "temp1=i%7" #被7整除
  6. if [ "$temp1" -ne ]
  7. then
  8. continue
  9. fi
  10. echo -n "$i "
  11. let "temp2=m%7" #7个数字换一行
  12. if [ "$temp2" -eq ]
  13. then
  14. echo ""
  15. fi
  16. let "m++"
  17. done

6、select结构

  select结构从技术角度看不能算是循环结构,只是相似而已,它是bash的扩展结构用于交互式菜单显示,功能类似于case结构比case的交互性要好。

  1、select带参数列表

  1. #!/bin/bash
  2. echo "What is your favourite color? "
  3. select color in "red" "blue" "green" "white" "black"
  4. do
  5. break
  6. done
  7. echo "You have selected $color"

  结果:

  1. houdembp:shell-home xxx$ sh for.sh
  2. What is your favourite color?
  3. ) red
  4. ) blue
  5. ) green
  6. ) white
  7. ) black
  8. #?
  9. You have selected green

  2、select不带参数列表

  该结构通过命令行来传递参数列表,由用户自己设定参数列表。

  1. #!/bin/bash
  2. echo "What is your favourite color? "
  3. select color
  4. do
  5. break
  6. done
  7. echo "You have selected $color"

  结果:

  1. houdembp:shell-home xxx$ sh for.sh red blue orange black
  2. What is your favourite color?
  3. ) red
  4. ) blue
  5. ) orange
  6. ) black
  7. #?
  8. You have selected black

shell条件控制和循环结构的更多相关文章

  1. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  2. Shell学习(三)——Shell条件控制和循环语句

    参考博客: [1]Shell脚本的条件控制和循环语句 一.条件控制语句 1.if语句 1.1语法格式: if [ expression ] then Statement(s) to be execut ...

  3. shell流程控制与循环结构

    shell脚本中的流程控制有if/else语句.case语句,循环结果包括for循环.while循环.until循环等内容. if语句 (1)最简单的if语句.使用格式有2种方式,分别如下 使用格式1 ...

  4. Shell脚本的条件控制和循环语句

    条件判断:if语句 语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi 注意:expre ...

  5. Java基础—控制流程语句(条件语句与循环结构)

    与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流程.Java的控制流程结构与C和C++的控制流程机构一样,只有很少的例外情况.没有goto语句,但break语句可以带标签,可以利用它实 ...

  6. Java使用条件语句和循环结构确定控制流

    与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流.本文将简单讲解条件.循环和switch. 一.块作用域 块(block),即复合语句.是指由一对大括号括起来的若干条简单的Java语句 ...

  7. Python - 条件控制、循环语句 - 第十二天

    Python 条件控制.循环语句 end 关键字 关键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符,实例如下: Python 条件语句是通过一条或多条语句的执行结果(True 或 ...

  8. 051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试--debug入门1 本文知识点: 程序调试--debug入门1 程序 ...

  9. 049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句

    049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句 本文知识点:break语句 break语句 break语句前情回顾 1.swi ...

随机推荐

  1. Lazarus 0.9.26——UTF8编码副作用

    Lazarus 0.9.26中,涉及范围最广的的改变就是所有的的String默认都采用UTF8编码,IDE终于有了完全的UTF8支持,以前在源码编辑器中“吃掉”半个汉字的情况不再出现.对于Linux下 ...

  2. adb INSTALL_FAILED_UPDATE_INCOMPATIBLE

    今天用Eclipse运行项目时出错: LOG: [2018-05-09 14:16:19 - Module_Android_Demo] ------------------------------ [ ...

  3. Android DevArt6:Android中IPC的六种方式

    Android中IPC的六种方式 1.使用Bundle 最简单的进程间通信方式:Intent + Bundle: 支持三大组件:Activity.Service.BroadcastReceiver : ...

  4. git工作操作步骤

    上班开始,打开电脑,git pull:拉取git上最新的代码: 编辑代码,准备提交时,git stash:将自己编辑的代码暂存起来,防止git pull时与库中的代码起冲突,否则自己的代码就白敲了: ...

  5. Delphi的子类化控件消息, 消息子类化

    所谓的子类化,网上有很多说明,我就说我个人的随意理解,可能有误,请列位看官斟酌理解. 所谓子类化,个人理解就是拦截某个控件的消息以及样式,来进行自己的特定处理以达到特殊的功能需求.这个子类化,可以有子 ...

  6. ArcGIS案例学习笔记-找出最近距离的垂线

    ArcGIS案例学习笔记-找出最近距离的垂线 联系方式:谢老师,135-4855-4328,xiexiaokui@qq.com 目的:对于任意矢量要素类,查找最近距离并做图 数据: 方法: 0. 计算 ...

  7. easyui分页,根据网友的一段代码优化了一下

    千言万语尽在代码中,可以自己看,不清楚留言吧! <%@ Page Language="C#" AutoEventWireup="true" CodeBeh ...

  8. 接收Android数据 递归显示表格数据

    <html> <head> <title>展示</title> <script type="text/javascript" ...

  9. redis 启动

    C:\Users\Administrator>cd c:\ c:\>cd redis-2.6 c:\redis-2.6>redis-server.exe redis.conf 测试r ...

  10. Java判断一个字符串中有多少大写字母、小写字母和数字

    Java判断一个字符串中有多少大写字母.小写字母和数字 思路: 大写字母就是A-Z之间,小写字母是a-z之间,数字就是0-9之间,于是做判断就好:用到的String知识点,遍历字符串, 长度方法len ...