循环概述
含义
将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件
循环类型
遍历(traversal) - 按规则访问非线性结构中的每一项。
迭代(iterate) - 按顺序访问线性结构中的每一项。
递归(recursion) - 在函数内调用自身, 将复杂情况逐步转化成基本情况。
- 循环次数事先已知
- 循环次数事先未知
循环原理
程序先进行语句判断,如为是则执行循环语句,然后继续进行语句判断,知道语句判断失败直接结束循环
常见的循环类型
- for
- while
- until
for
for需要知道循环的次数
读取不同的变量值,用来逐个执行同一组命令
语句结构
{}和seq在for循环中的应用
for i in {1..50..2} 1-50之间的奇数
for i in {2..50..2} 1-50之间的偶数
for i in {10..1} 1-10之间的倒序排列
for i in $(seq 10) 1-10之间的正序排列
for i in $(seq 10 - 1 1)1-10之间的倒叙
for i in $(seq 1 2 10) 1-10之间的奇数
for i in $(seq 2 2 10) 1-10之间的偶数
带列表循环
#结构
for i #自定义命名 in 循环次数
do
循环动作
done
#结束语
#示例一:
从1~100累加求和
#!/bin/bash
sum=0
for i in {1..100}
do
sum=$[i+sum]
done
echo $sum
或者:
let sum=$i+$sum
let sum+=i
#示例二:
求出1-100之间奇数累加和
#!/bin/bash
sum=0
for i in {1..100..2}
do
sum=$[sum+i]
done
echo $sum
不带列表循环
#结构
for 变量名 {取值列表}
do
循环动作
done
#结束语句
#示例
#!/bin/bash
for i
do
echo hello
done
类C循环
#结构
for (( 表达式1 ;表达式2;表达式3 ))
do
执行内容 #若满足循环则做什么动作
done #for循环结束标志
表达式1:定义变量并赋值
表达式2:决定是否循环
表达式3:决定循环变量如何改变,决定循环什么时候结束
#示例
1-10相加求和
#!/bin/bash
for ((i=1;i/dev/null
done
批量改后缀名
#!/bin/bash
cd /data/test
for i in *
#选取所有
do
name=`echo $i|awk -F '.' '{print $1}'`
#定义文件名
mv $i ${name}.bak
#替换后缀名
done
while和until
相对于for,需要知道循环次数
while和until只知道停止条件,不知道次数,就需要使用while
直到达到条件
while
#特性
while
当命令判断为假时停止
#结构
while 判断条件
do
需要循环的事件
done
死循环
while true
do
echo "这是一个死循环"
done
只能用Ctrl + C 停止
求和
#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]
do
let sum+=$i
let i++
done
echo $sum
猜价格游戏
#!/bin/bash
p=`echo $[RANDOM%100+1]`
t=0
while true
do
read -p "请输入你所猜测的商品价格:" num
let t++
if [ $num -eq $p ]
then
echo "恭喜恭喜,你猜中了,实际价格为$p"
echo "你一共猜了${t}次"
exit 0
elif [ $num -gt $p ]
then
echo "你猜高了"
else
echo "你猜低了"
fi
done
until
#特性
until
当命令判断为真时停止
until 循环条件
do
循环内容
done
#结束
求和
#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]
do
let sum+=$i
let i++
done
echo $sum
退出循环
exit
当执行 exit 语句后,脚本将立即终止,并且不会再执行后续的代码。
#!/bin/bash
while true
do
# 条件判断
if [ 条件 ]
then
exit # 退出脚本
fi
# 循环体代码
done
break
跳出单个循环后面加数字2则代表跳出两层循环
break 具体数字 #指代跳出多少层循环
#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ]
then break 2
fi
echo i=$i
done
continue
终止某次循环中的命令,但是不会完全终止命令
#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ]
then continue 2
fi
echo i=$i
done