C语言风格的 for 循环

C语言风格的 for 循环的用法如下:

for((exp1; exp2; exp3))
do
    statements
done

几点说明:

  • exp1、exp2、exp3 是三个表达式,其中 exp2 是判断条件,for 循环根据 exp2 的结果来决定是否继续下一次循环;
  • statements 是循环体语句,可以有一条,也可以有多条;
  • do 和 done 是 Shell 中的关键字。

它的运行过程为:
1) 先执行 exp1。

2) 再执行 exp2,如果它的判断结果是成立的,则执行循环体中的语句,否则结束整个 for 循环。

3) 执行完循环体后再执行 exp3。

4) 重复执行步骤 2) 和 3),直到 exp2 的判断结果不成立,就结束循环。

上面的步骤中,2) 和 3) 合并在一起算作一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2) 和 3)。

exp1 仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。exp2 一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。exp3 很多情况下是一个带有自增或自减运算的表达式,以使循环条件逐渐变得“不成立”。

for 循环的执行过程可用下图表示:

下面我们给出一个实际的例子,计算从 1 加到 100 的和。

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

运行结果:
The sum is: 5050

代码分析:
1) 执行到 for 语句时,先给变量 i 赋值为 1,然后判断 i<=100 是否成立;因为此时 i=1,所以 i<=100 成立。接下来会执行循环体中的语句,等循环体执行结束后(sum 的值为1),再计算 i++。

2) 第二次循环时,i 的值为2,i<=100 成立,继续执行循环体。循环体执行结束后(sum的值为3),再计算 i++。

3) 重复执行步骤 2),直到第 101 次循环,此时 i 的值为 101,i<=100 不再成立,所以结束循环。

由此我们可以总结出 for 循环的一般形式为:

for(( 初始化语句; 判断条件; 自增或自减 ))
do
    statements
done

for 循环中的三个表达式

for 循环中的 exp1(初始化语句)、exp2(判断条件)和 exp3(自增或自减)都是可选项,都可以省略(但分号;必须保留)。

1) 修改“从 1 加到 100 的和”的代码,省略 exp1:

  1. #!/bin/bash
  2. sum=0
  3. i=1
  4. for ((; i<=100; i++))
  5. do
  6. ((sum += i))
  7. done
  8. echo "The sum is: $sum"

可以看到,将i=1移到了 for 循环的外面。

2) 省略 exp2,就没有了判断条件,如果不作其他处理就会成为死循环,我们可以在循环体内部使用 break 关键字强制结束循环:

  1. #!/bin/bash
  2. sum=0
  3. for ((i=1; ; i++))
  4. do
  5. if(( i>100 )); then
  6. break
  7. fi
  8. ((sum += i))
  9. done
  10. echo "The sum is: $sum"

break 是 Shell 中的关键字,专门用来结束循环,后续章节还会深入讲解。

3) 省略了 exp3,就不会修改 exp2 中的变量,这时可在循环体中加入修改变量的语句。例如:

  1. #!/bin/bash
  2. sum=0
  3. for ((i=1; i<=100; ))
  4. do
  5. ((sum += i))
  6. ((i++))
  7. done
  8. echo "The sum is: $sum"

4) 最后给大家看一个更加极端的例子,同时省略三个表达式:

  1. #!/bin/bash
  2. sum=0
  3. i=0
  4. for (( ; ; ))
  5. do
  6. if(( i>100 )); then
  7. break
  8. fi
  9. ((sum += i))
  10. ((i++))
  11. done
  12. echo "The sum is: $sum"

这种写法并没有什么实际意义,仅仅是为了给大家做演示。

]# cat a.sh
#!/bin/bash
i=1
for ((; i<=10; i++))
do
echo "h">>a
done
echo "The i is: $i"

举例

#!/bin/bash
i=0
for i in {Z..A}
do
echo $i
done

[root@localhost bash20200508]# ./az.sh

Z
Y
X
W
V
U
T
S
R
Q
P
O
N
M
L
K
J
I
H
G
F
E
D
C
B
A

C语言风格的 for 循环(SHELL的循环写法 已验证20200517)的更多相关文章

  1. shell 各种循环判断

    shell支持的循环有 Shell if else Shell case esac Shell for循环 Shell while循环 Shell until循环

  2. 15 shell for循环

    除了 while 循环和 until 循环,Shell 脚本中还有for 循环,for 循环有两种使用形式:C语言风格的for循环与Python语言风格的for in循环,两种形式的for循环用法对比 ...

  3. shell脚本--循环结构

    shell的循环结构有while和for两种 for循环 #!/bin/bash #文件名:test.sh i=4 for i in 2 4 6 8 10 do echo $i done echo $ ...

  4. shell脚本循环嵌套

    嵌套循环 在循环语句内使用任意类型的命令,包括其他循环命令,叫做嵌套循环.因为是在迭代中迭代,需要注意变量的使用以及程序的效率问题. 下面举一个for循环嵌套for循环的例子: wangsx@SC-2 ...

  5. Linux Shell系列教程之(十)Shell for循环

    本文是Linux Shell系列教程的第(十)篇,更多Linux Shell教程请看:Linux Shell系列教程 基本任何语言都有自己的循环语句,Shell当然也不例外,今天就为大家介绍下Shel ...

  6. shell脚本-循环选择语句

    shell脚本-循环选择语句 过程式编程语言: 顺序执行 选择执行 循环执行 注:条件中的变量,可以在执行语句中使用,不用在加上"$". if语句 根据命令的退出状态来执行命令 单 ...

  7. Linux shell for循环结构

    Linux Shell   for循环结构 循环结构            1:循环开始条件      2:循环操作      3:循环终止的条件 shell语言          for,while ...

  8. shell (二) shell for循环

    for循环 基本示例 for i in var1 var2 var2 do echo $i done for i in {1..100} do echo $i done 列表中复杂值,可以使用引号或者 ...

  9. Linux 之Shell for循环

    @代表所有参数所以如果后面跟上echo $v你会发现他会一次显示user userdebug eng $poo -le ${#prodlist[@]} 这句话是说 $poo小于等于prodlist中的 ...

随机推荐

  1. [hash-bfs]USACO 3.2 Magic Squares 魔板

    魔 板 魔板 魔板 题目描述 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色 ...

  2. docker部署skywalking

    https://www.cnblogs.com/xiao987334176/p/13530575.html

  3. java面试-CAS底层原理

    一.CAS是什么? 比较并交换,它是一条CPU并发原语. CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B.当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什 ...

  4. 机器学习--Micro Average,Macro Average, Weighted Average

    根据前面几篇文章我们可以知道,当我们为模型泛化性能选择评估指标时,要根据问题本身以及数据集等因素来做选择.本篇博客主要是解释Micro Average,Macro Average,Weighted A ...

  5. 期末考试复习c#时总结的抽象类与接口的一些区别

    抽象类: (1)抽象类中可以定义抽象方法,属性,变量 (2)抽象类的派生类必须实现所有的抽象方法.要求所有的派生非抽象类都要用override重写实现抽象方法. (3)抽象类可以存放抽象方法,属性,也 ...

  6. Java(81-93)【数组】

    1.省略格式 静态初始化的时候格式还可以省略一下 int[ ] arrayA={10,20,30}; 静态和动态都可以拆 int[] arrayB; arrayB=new int[ ]{11,21,3 ...

  7. CentOS7 常用基础操作

    系统目录结构了解 CentOS系统中没有磁盘的概念,一切皆文件,/目录下的的一个个文件夹目录就相当于磁盘了,这里简单记录几个常用的目录以及对应的作用: dev:Linux一切皆文件,包括硬件也进行了文 ...

  8. 【日志追踪】(微服务应用和单体应用)-logback中的MDC机制

    一.MDC介绍 MDC(Mapped Diagnostic Contexts)映射诊断上下文,该特征是logback提供的一种方便在多线程条件下的记录日志的功能, 某些应用程序采用多线程的方式来处理多 ...

  9. hdu1671 字典树记录前缀出现次数

    题意:       给你一堆电话号,问你这些电话号后面有没有相互冲突的,冲突的条件是当前这个电话号是另一个电话号的前缀,比如有 123456789 123,那么这两个电话号就冲突了,直接输出NO. 思 ...

  10. POJ2570 二进制,位运算,Floyd

    题意:       给你一个有向图,两点之间有多种连接方式,然后每次询问都问你点A,B之间有哪些方式可以到达,每个小字母是一个方式. 思路:       很巧妙的位运算和Floyd应用,借助Floyd ...