shell-for步进循环

基本语法

for循环通常用于将一组语句执行已知的次数,基本语法是:

  for var in {start...end...step}
  do       
        str1
        str2
        ...
  done

var是变量,{}整体上是一个列表,start代表列表的初始数值,end代表结束的数值,step代表步长,如{1..10..2}的意思是从1开始,到10结束,每两步输出一次,即1,3,5,7,9
do和done之间的所有语句称为循环体,也就是在循环过程中,我们要真正执行的语句,具体执行多少次得看{}中的元素个数

实例1,以步长为2,求100以内奇数相加的和

  #!/bin/bash
  sum=0
  for i in {1..100..2}
  do
          let "sum+=i"   等同于:sum=sum+i
  done
  echo "一百以内奇数相加的和为: $sum "

输出结果:
shell-for步进循环

实例2:列出当前目录所有文件

  #!/bin/bash
  for file in *       *等同于ls * 即列出当前目录所有文件
  do
          echo "$file"   
  done

输出结果:
shell-for步进循环

for循环还有一个重要的作用就是输出脚本的参数,例如输入参数1-9,给每个参数加1后输出

  #!/bin/bash
  echo "$*"
  for sum in $*
  do
          let "sum+=1"
          echo "$sum"
  done

输出结果为:
shell-for步进循环

不带列表的for循环

在特殊情况下for循环可以不带条件列表,由shell直接从命令行中获取列表,例如

  #!/bin/bash
  for sum
  do
        let "sum+=2"
        echo "加2后为:$sum"
  done

结果为:
shell-for步进循环

这种写法每次都还在命令行交互,不够自动化,一般不用。

C语言式for循环

Linux因为是用C语言开发的,大部分人都或多或少的接触过C语言,所以bash也支持类C语言的for循环语句,基本语法为:

  for ((x;y;z))
  do
        statement1;
        statement2;
        .....
  done

x一般表示变量初始值,y即决定循环的条件,返回值为0时,进行循环,非0时,退出循环;z表示改变变量的条件,例如自增自减....

实例一:

  #!/bin/bash
  for (( i=1;i<=5;i++))
  do
          echo "这是第 $i 次循环"
  done

i的值为1,i小于等于5,i每循环一次加一,即i循环五次,每次在前一次的基础上加1,也就是输出:1,1+1,2+1,3+1,4+1,(5+1=6大于5了,返回值就非0,不输出)如图
shell-for步进循环

注意死循环!

和C语言一样,在shell中也可以将for循环条件中的的任意部分省略掉,也可以全部省略,为了方便演示就用上面的代码了
第一种,缺省初始变量

  #!/bin/bash
  for ((;i<=5;i++))
  do
          echo "这是第 $i 次循环"
  done

输出结果为:
shell-for步进循环
也就是说,即使没加初始变量,shell把他当成空,还是会进行计算,步骤就变成了:空加1,1+1,2+1,3+1,4+1。循环了六遍

第二种,缺省变量条件限制

  #!/bin/bash
  for ((;;i++))
  do
          echo "这是第 $i 次循环"
  done

结果如下,停止时因为我ctrl+c结束了这个进程,因为没加结束条件,理论上他自己是永远不会停止循环的。(所以我们要加条件就是让脚本达到需求后就退出循环)
shell-for步进循环

第三种,缺省了变化条件,可想而知,也就是进行不变化的循环

使用c循环要特别注意退出循环的条件,一不小心就会变成死循环。

遍历数组

shell为遍历数组提供一种特别的写法:

  for var in ${array[*]}
  do
        statement1
        statement2
  done

var是变量,array是数组名,statement是达到目的后循环的条件。在遍历的过程中,for循环语句会将每个数组元素的值赋给变量var。
举个例子:

  #!/bin/bash  
  array=("周一" "周二" "周三" "周四" "周五" "周六" "周日")
  for day in ${array[*]}
  do
          echo "$day"
  done

循环结果为:
shell-for步进循环

shell-for步进循环

上一篇:如何在Ubuntu 20.04上安装Ruby2.7.0


下一篇:Jersey Politics