一、简介

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

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

(2)列表for循环

#!/bin/bash

for varible1 in {..}
#for varible1 in
do
echo "Hello, Welcome $varible1 times "
done
  • do和done之间的命令称为循环体,执行次数和list列表中常数或字符串的个数相同。for循环,首先将in后list列表的第一个常数或字符串赋值给循环变量,然后执行循环体,以此执行list,最后执行done命令后的命令序列。
  • Sheel支持列表for循环使用略写的计数方式,1~5的范围用{1..5}表示(大括号不能去掉,否则会当作一个字符串处理)。
  • Sheel中还支持按规定的步数进行跳跃的方式实现列表for循环,例如计算1~100内所有的奇数之和。
#!/bin/bash
sum= for i in {....}
do
let "sum+=i"
done echo "sum=$sum"

通过i的按步数2不断递增,计算sum值为2500。同样可以使用seq命令实现按2递增来计算1~100内的所有奇数之和,for i in $(seq 1 2 100),seq表示起始数为1,跳跃的步数为2,结束条件值为100。

  • for循环对字符串进行操作,例如通过for循环显示当前目录下所有的文件。
#!/bin/bash

for file in $( ls )
#for file in *
do
echo "file: $file"
done

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

  • for通过命令行来传递脚本中for循环列表参数
#!/bin/bash

echo "number of arguments is $#"

echo "What you input is: "

for argument in "$@"
do
echo "$argument"
done

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

(3)不带列表for循环

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

#!/bin/bash

echo "number of arguments is $#"

echo "What you input is: "

for argument
do
echo "$argument"
done

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

(4)类C风格的for循环

也被称为计次循环

#!/bin/bash
for((integer = ; integer <= ; integer++))
do
echo "$integer"
done

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

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

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

#!/bin/bash

sum=

for(( i = ; i <= ; i = i +  ))
do
let "sum += i"
done echo "sum=$sum"

2、while循环

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

(1)计数器控制的while循环 使用(())标识符 ,注意while与括号,括号与内容之间都有空格

#!/bin/bash

sum=

i=

while(( i <=  ))
do
let "sum+=i"
let "i += 2"
done echo "sum=$sum"

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

(2)结束标记控制的while循环

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

#!/bin/bash

echo "Please input the num(1-10) "
read num while [[ "$num" != ]]
do
if [ "$num" -lt ]
then
echo "Too small. Try again!"
read num
elif [ "$num" -gt ]
then
echo "To high. Try again"
read num
else
exit
fi
done echo "Congratulation, you are right! "

#!/bin/bash

echo "Please input the num "
read num factorial= while [ "$num" -gt ]
do
let "factorial= factorial*num"
let "num--"
done echo "The factorial is $factorial"

(3)标志控制的while循环,注意while与括号,括号与内容之间都有空格

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

#!/bin/bash

echo "Please input the num "
read num sum=
i= signal= while [[ "$signal" -ne ]]
do
if [ "$i" -eq "$num" ]
then
let "signal=1"
let "sum+=i"
echo "1+2+...+$num=$sum"
else
let "sum=sum+i"
let "i++"
fi
done

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

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

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

#!/bin/bash

echo "number of arguments is $#"

echo "What you input is: "

while [[ "$*" != "" ]]
do
echo "$1"
shift
done

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

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

#!/bin/bash

i=

until [[ "$i" -gt  ]]    #大于5
do
let "square=i*i"
echo "$i * $i = $square"
let "i++"
done

4、循环嵌套

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

(1)嵌套循环实现九九乘法表

#!/bin/bash

for (( i = ; i <=; i++ ))
do for (( j=; j <= i; j++ ))
do
let "temp = i * j"
echo -n "$i*$j=$temp "
done echo "" #output newline
done

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

#!/bin/bash

for ((i=; i <= ; i++))
do
j=;
while ((j > i))
do
echo -n " "
let "j--"
done
k=
while ((k <= i))
do
echo -n "*"
let "k++"
done
echo ""
done

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

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

(1)break

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

#!/bin/bash

sum=
for (( i=; i <= ; i++))
do
let "sum+=i" if [ "$sum" -gt ]
then
echo "1+2+...+$i=$sum"
break
fi
done

(2)continue

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

#!/bin/bash

m=
for (( i=; i < ; i++ ))
do
let "temp1=i%7" #被7整除 if [ "$temp1" -ne ]
then
continue
fi echo -n "$i " let "temp2=m%7" #7个数字换一行 if [ "$temp2" -eq ]
then
echo ""
fi let "m++"
done

6、select结构

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

(1)select带参数列表

#!/bin/bash

echo "What is your favourite color? "

select color in "red" "blue" "green" "white" "black"
do
break
done echo "You have selected $color"

(2)select不带参数列表

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

#!/bin/bash

echo "What is your favourite color? "

select color
do
break
done echo "You have selected $color"

三、总结

(1)循环结构中相互嵌套组成更复杂的流程,并结合break和continue可以实现很多复杂的运算。

(2)可以结合其他语言的语法有助于更好的理解循环结构。

(3)熟练应用还需要大量的重复练习,重写优秀的shell代码也是一种很好的方式。

(以上转自https://blog.csdn.net/taiyang1987912/article/details/38929069)

【转】shell之for、while、until循环的更多相关文章

  1. linux下的Shell编程(5)循环

    Shell Script中的循环有下面几种格式: while [ cond1 ] && { || } [ cond2 ] -; do - done for var in -; do - ...

  2. linux shell中 if else for循环以及大于、小于、等于逻辑表达式的历程

    作者:邓聪聪 比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注意:这里的空格很重要.要确保方括号的空格.笔者就曾因为空格缺少或位置不对,而浪费好多宝 ...

  3. shell编程学习笔记(十一):Shell中的while/until循环

    shell中也可以实现类似java的while循环 while循环是指满足条件时,进行循环 示例: #! /bin/sh index=10 while [ $index -gt 0 ] do inde ...

  4. Shell编程-08-Shell中的循环语句

    目录 while语句 until语句 for语句 select语句 循环中断控制 循环语句总结     循环语句常用于重复执行一条命令或一组命令等,直到达到结束条件后,则终止执行.在Shell中常见的 ...

  5. shell脚本判断语句和循环语句

    if判断语句 exit跳出判读语句 不加exit的结果 read -n(不换行) 判断是否输入的是数字 read age[[ $age =~ ^[0-9]+$ ]]if [ $? -ne 0 ]; t ...

  6. shell基础(八)-循环语句

    国庆过后:感觉有点慵懒些了:接着上篇:我们继续来学习循环语句. 一. for循环 与其他编程语言类似,Shell支持for循环. for循环一般格式为: for 变量 in 列表 do command ...

  7. Shell脚本之:退出循环

    Shell也使用 break 和 continue 来跳出循环. break命令 下面的例子中,脚本进入死循环直至用户输入数字大于5,使用break跳出这个循环. #!/bin/bash while ...

  8. 【shell】shell编程(四)-循环语句

    上篇我们学习了shell中条件选择语句的用法.接下来本篇就来学习循环语句.在shell中,循环是通过for, while, until命令来实现的.下面就分别来看看吧. for for循环有两种形式: ...

  9. Shell脚本之七 选择、循环结构

    一.if else if 语法格式 if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符): if [ $(ps -e ...

  10. shell 学习笔记9-while/until循环语句

    一.while循环语句 1.循环语句 循环愈久就是重复执行一条指令或一组执行,知道条件不在满足时停止,shell循环语句包括,while.until.for.select语句 2.while循环 主要 ...

随机推荐

  1. 数据挖掘---Matplotib的学习

    什么是matplotlib mat - matrix 矩阵                二维数据 - 二维图表            plot - 画图            lib - libra ...

  2. C# -- 文件的压缩与解压(GZipStream)

    文件的压缩与解压 需引入 System.IO.Compression; 1.C#代码(入门案例) Console.WriteLine("压缩文件..............."); ...

  3. June 9. 2018, Week 23rd, Saturday

    I know nothing except the fact of my ignorance. 除了自己的无知,我一无所知. Believe it or not, true wisdom exists ...

  4. March 04th, 2018 Week 10th Sunday

    Tomorrow never comes. 我生待明日,万事成蹉跎. Most of my past failures can be chalked up to the bad habit of pr ...

  5. mybatis根据数据库表结构自动生成实体类,dao,mapper

    首先, pom需要引入 <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifac ...

  6. Vue使用枚举类型实现HTML下拉框

    下拉框包含option中的Value和用来显示的选项, 一般后台都是使用的Value值,而不是显示在前台的选项 第一步: 编写下拉框需要的枚举类型 StatusEnum.java public enu ...

  7. vue-cli笔记

    总是忘,留个笔记. vue-cli A simple CLI for scaffolding Vue.js projects. Installation Prerequisites: Node.js ...

  8. spring boot 的maven设置阿里云仓库

    <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> ...

  9. (转)Spring Boot 2 (二):Spring Boot 2 尝鲜-动态 Banner

    http://www.ityouknow.com/springboot/2018/03/03/spring-boot-banner.html Spring Boot 2.0 提供了很多新特性,其中就有 ...

  10. [matlab] 6.粒子群优化算法

    粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早由Kennedy和Eberhart在19 ...