一、循环概念
1、概念
循环是一种重复执行一段代码的结构。只要满足循环的条件,会一直执行这个代码
2、循环条件
在一定范围之内,按照指定的次数来执行循环。
3、循环体
在指定的次数内,执行的命令序列。只要条件满足,循环体会被一直执行。
4、循环和遍历
遍历指对数据结构中每个元素进行一个访问的过程。通常和循环一起使用。
访问的目的就是为了执行特定的操作。
循环是操作,遍历是输出。
5、循环的作用
5.1 重复执行代码,尤其是统一的、相同的、批量的操作
5.2 提高代码的重复利用率
5.3 提高人工的效率,减少人工的干预,效率变高
5.4 简化程序的逻辑,降低代码出错的可能性
二、循环的语法
(一)循环适用条件
for循环:用于已知循环次数的场景
while循环:和for循环可以通用,长用于死循环
until:条件不满足才执行循环。
(二)循环格式
1、for循环格式
格式1
for i in {}
do
命令序列
done
#for 变量名称(前面没有$) in 范围 {}
例子1
# 创建 vim test1.sh
for i in {1..10}
do
echo $i
done
# 验证 sh test1.sh
#现在要求创建一个文件passwd.txt
#在这个文件中创建三行,xy101 xy 102 xy103
#使用循环创建这三个用户,统一设定密码为123456
#创建 vim passwd.txt
xy101
xy102
xy103
# 创建 vim test2.sh
for user in $(cat /opt/passwd.txt)
do
useradd $user
echo 123456 | passwd --stdin $user
done
# 验证 sh test2.sh
#如何实现累加求和?1~100一直相加,最后的结果是多少?用循环来实现?
# 创建 vim test4.sh
sum=0
for i in {1..100}
do
sum=$(($sum+$i))
done
echo $sum
# 验证 sh test4.sh
#如何实现累加求和?1~100一直相加,最后的结果是多少?用循环来实现?
#分别求出奇数和、偶数和
sum1=0
sum2=0
for i in {1..100}
do
if [[ $i%2 -eq 0 ]]
sum1=$(($sum1+$i))
else
sum2=$(($sum2+$i))
fi
done
echo $sum1
echo $sum2
类c语言格式
#类c语言格式:
for((表达式1;表达式2;表达式3))
do
命令序列
for((i=0;i<=5;i++))
表达式1:定义变量并且赋予初始值
表达式2:循环范围
表达式3:循环的方式,变量每一次自增1
# 创建 vim test3.sh
for((i=0;i<=5;i++))
do
echo $i
done
# 验证 sh test3.sh
#自定义输入一个数,然后求从1到该数字的累加和?不要超过100.
# 创建 vim test5.sh
read -p "输入一个0~100之间的随机数" num
sum=0
for((i=0;i<=$num;i++))
do
sum=$(($sum+$i))
done
echo $sum
# 验证 sh test5.sh
死循环
#死循环:
for((;;))
do
命令序列
done
2、break和continue
break:在循环内部,执行到break命令时,会立即跳出当前循环,并终止
continue:执行到continue,跳出当前循环,但是如果循环条件依然满足,会继续后续执行循环条件
# 猜数字 输入一个0~10的随机数,这个数由系统随机生成
# 创建 vim test7.sh
for i in {1..10}
do
if [ $i -eq 3 ]
then
break
fi
echo $i
done
# 验证 sh test7.sh
# break 结果只显示1 2
# continue 结果显示1 2 4 5 6 7 8 9 10
3、$RANDOM
$RANDOM 0~32767
# linux中shell随机生成的变量,可随机生成整数
命令行中
0~32767
# 输入a=$RANDOM
# 再输入echo $a 即随机生产0~32767内的随机数字
0~100
# 输入a=$((RANDOM%100))
# 再输入echo $a 即随机生产0~100内的随机数字
0~10
# 输入a=$((RANDOM%10))
# 再输入echo $a 即随机生产0~10内的随机数字
0~100包含100
# 输入a=$((RANDOM%100+1))
# 再输入echo $a 即随机生产0~100的随机数字
# 猜数字,输入一个0~100的随机数,这个随机数由系统生成
#死循环,一直到用户猜中为止,猜中了循环才会终止
#$RANDOM 0~32767
# 循环控制语句 continue break
#猜大了,提示用户猜大了,猜小了,提示用户猜小了,猜对了,终止循环,并提示用户你猜对了!
num=$((RANDOM%100+1))
for ((;;))
do
read -p "请输入一个数字" user
if [ $num -eq $user ]
then
echo "你猜对了!"
break
elif [ $user -gt $num ]
then
echo "猜大了"
elif [ $user -lt $num ]
then
echo "猜小了"
fi
done
#猜几次猜对了
time=0
num=$((RANDOM%100+1))
for ((;;))
do
read -p "请输入一个数字" user
if [ $num -eq $user ]
then
echo "你猜对了!一共猜了$time次"
break
elif [ $user -gt $num ]
then
echo "猜大了"
elif [ $user -lt $num ]
then
echo "猜小了"
fi
done
需求1:淘宝购物
逛淘宝选购商品,每家商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元),每次选购完或不买都会提示用户是否继续逛下一家商店,如果不再继续逛的话进行购物车结算总额。
num=o
for((;;))
do
echo "衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元"
echo "购买衣服输入1,购买裤子输入2,购买鞋子输入3,购买帽子输入4,购买袜子输入5,不选购输入6"
read -p "请开始购物" a
case $a in
1)
echo "$a,已选购一件袜子50元"
num=$(($num+50))
;;
2)
echo "$a,选购一件帽子150元"
num=$(($num+150))
;;
3)
echo "$a,选购一件鞋子350元"
num=$(($num+350))
;;
4)
echo "$a,选购一条裤子400元"
num=$(($num+400))
;;
5)
echo "$a,选购一件衣服500元"
num=$(($num+500))
;;
6)
echo "$a,未选购商品"
num=$(($num+0))
;;
*)
echo "输入不正确!"
esac
read -p "是否继续购买(yes/no):" mai
if [ $mai == yes ]
then
continue
elif [ $mai == no ]
then
echo $num
break
fi
done
验证:
!
需求2:
某山顶上有一颗香蕉树,一只猴子第一天从树上摘了若干根香蕉,当即就吃了一半,还不过瘾,
又多吃了一根。第二天猴子又将剩下的香蕉吃了一半,禁不住诱惑,又多吃了一根香蕉。
依此类推,每天都将剩余的香蕉吃一半后再多吃一根。到了第十天,猴子发现只剩一根香蕉了,
请问这只猴子在第一天总共摘了多少根香蕉?
sum=1
for((i=9;i>=1;i--))
do
sum=$((($sum+1)*2))
echo "第${i}天开始时有${sum}根香蕉"
done
sum=1
for i in {1..9}
sum=$(($sum+1))
sum=$(($sum*2))
done
echo $sum
验证: