基本语法
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 "
输出结果:
实例2:列出当前目录所有文件
#!/bin/bash
for file in * *等同于ls * 即列出当前目录所有文件
do
echo "$file"
done
输出结果:
for循环还有一个重要的作用就是输出脚本的参数,例如输入参数1-9,给每个参数加1后输出
#!/bin/bash
echo "$*"
for sum in $*
do
let "sum+=1"
echo "$sum"
done
输出结果为:
不带列表的for循环
在特殊情况下for循环可以不带条件列表,由shell直接从命令行中获取列表,例如
#!/bin/bash
for sum
do
let "sum+=2"
echo "加2后为:$sum"
done
结果为:
这种写法每次都还在命令行交互,不够自动化,一般不用。
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,不输出)如图
注意死循环!
和C语言一样,在shell中也可以将for循环条件中的的任意部分省略掉,也可以全部省略,为了方便演示就用上面的代码了
第一种,缺省初始变量
#!/bin/bash
for ((;i<=5;i++))
do
echo "这是第 $i 次循环"
done
输出结果为:
也就是说,即使没加初始变量,shell把他当成空,还是会进行计算,步骤就变成了:空加1,1+1,2+1,3+1,4+1。循环了六遍
第二种,缺省变量条件限制
#!/bin/bash
for ((;;i++))
do
echo "这是第 $i 次循环"
done
结果如下,停止时因为我ctrl+c结束了这个进程,因为没加结束条件,理论上他自己是永远不会停止循环的。(所以我们要加条件就是让脚本达到需求后就退出循环)
第三种,缺省了变化条件,可想而知,也就是进行不变化的循环
使用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
循环结果为: