一、循环
循环:循环是一种重复执行一段代码的结构。只要满足循环的条件,会一直执行这个代码。
循环条件:在一定范围之内,按照指定的次数来执行循环。
循环体:在指定的次数内,执行的命令序列。只要条件满足,循环体会被一直执行。
循环和遍历:
遍历值得就是对数据结构中每个元素进行一次访问的过程。通常和循环一起使用。
访问的目的:就是为了执行特定的操作
循环是操作
遍历就是输出
1.1、循环的作用:
1、重复执行代码,尤其是统一的,相同的,批量的操作。
2、提高代码的重复利用率。
3、提高人工的效率,减少人工的干预,提高效率。
4、简化程序的逻辑,降低代码出错的可能性。
二、for循环
for循环:已知循环次数的场景。
while循环:和for循环可以通用,常用于死循环
until:条件不满足才执行循环,条件不满足,不执行。
for循环的格式:
格式1
for 变量名称 (前面没有$) in 范围 {}
for 变量名称 (前面没有$) in 范围 {}
do
命令序列
done
[root@localhost opt]# vim test11.sh
for i in {1..17}
do
echo $i
done
[root@localhost opt]# sh test11.sh
1
2
3
4
#现在创建一个文件passwd.txt
#在文件中创建三行,xy101 xy102 xy103
#使用循环创建这个三个用户,统一密码为123456.
[root@localhost opt]# vim passwd.txt
[root@localhost opt]# vim test12.sh
for user in $(cat /opt/passwd.txt)
do
useradd $user
echo 123456 | passwd --stdin $user
done
[root@localhost opt]# sh test12.sh
更改用户 xy101 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“xy102”已存在
更改用户 xy102 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 xy103 的密码 。
passwd:所有的身份验证令牌已经成功更新。
格式2:类c语言格式:
for ((表达式1;表达式2;表达式3))
for ((表达式1;表达式2;表达式3))
do
命令序列
done
for ((i=0;i<=5;i++))
表达式1:定义变量并且赋予初始值
表达式2:循环的范围
表达式3:循环的方式,循环一次自增1
#累加求和?1-100一直相加,最后的结果
[root@localhost opt]# vim test13.sh
#累加求和?1-100一直相加,最后的结果
sum=0
for ((i=0;i<=100;i++))
do
sum=$(($sum+$i))
done
echo $sum
[root@localhost opt]# sh test13.sh
5050
[root@localhost opt]# vim test13.sh
#累加求和?1-100一直相加,最后的结果
#分别求出奇数和以及偶数和
sum1=0
sum2=0
for ((i=0;i<=100;i++))
do
if [[ $i%2 -eq 0 ]]
then
sum1=$(($sum1+$i))
else
sum2=$(($sum2+$i))
fi
done
echo $sum1
echo $sum2
[root@localhost opt]# sh test13.sh
2550
2500
[root@localhost opt]# vim test14.sh
#累加求和?1-100一直相加,最后的结果
#分别求出奇数和以及偶数和
read -p "输入一个0-100之间的随机数:" a
sum1=0
for ((i=1;i<=$a;i++))
do
sum1=$(($sum1+$i))
done
echo $sum1
[root@localhost opt]# vim test14.sh
[root@localhost opt]# sh test14.sh
输入一个0-100之间的随机数:34
595
[root@localhost opt]# sh test14.sh
输入一个0-100之间的随机数:100
5050
格式3:死循环
死循环
for((;😉)
do
命令序列
done
#break:在循环内部,执行到break命令时,会立即跳出当前循环,并
#continue:把执行到contiune时,跳出当前循环,但是如果循环条件依然满足,>
会执行后续的循环条件。
[root@localhost opt]# vim test14.sh
a=$((RANDOM%10+1))
for ((i=1;;i++))
do
read -p "输入0-10数字" b
if [[ $b -gt $a ]]
then
echo "猜大了"
elif [[ $b -lt $a ]]
then
echo "猜小了"
else
echo "猜对了,猜了$i次"
break
fi
done
[root@localhost opt]# sh test14.sh
输入0-10数字5
猜大了
输入0-10数字6
猜大了
输入0-10数字7
猜大了
输入0-10数字3
猜大了
输入0-10数字2
猜对了,猜了5次
作业:
例题:购物
逛淘宝选购商品,
每家商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元),
每次选购完或不买都会提示用户是否继续逛下一家商店,
如果不再继续逛的话进行购物车结算总额。.
[root@localhost opt]# vim test15.sh
a=500
b=400
c=300
d=150
e=50
sum=0
read -p "是否进入这家店" h
if [[ $h == yes ]]
then
echo "进入这家店"
fi
for ((;;))
do
for ((;;))
do
echo "a:衣服500元,b:裤子400元,c:鞋子300元,d:帽子150元,e:袜子50元"
read -p "加入购物车" i
sum=$(($sum+$i))
read -p "是否结束加入购物车" k
if [[ $k == yes ]]
then
echo "完成加入购物车"
echo "$sum"
break
fi
done
read -p "是否购买yes/no" j
if [[ $j == yes ]]
then
echo "$sum"
echo "是否继续逛下一家"
else
echo "是否继续逛下一家"
fi
break
done
[root@localhost opt]# sh test15.sh
是否进入这家店ys
a:衣服500元,b:裤子400元,c:鞋子300元,d:帽子150元,e:袜子50元
加入购物车^C
[root@localhost opt]# sh test15.sh
是否进入这家店yes
进入这家店
a:衣服500元,b:裤子400元,c:鞋子300元,d:帽子150元,e:袜子50元
加入购物车a
是否结束加入购物车no
a:衣服500元,b:裤子400元,c:鞋子300元,d:帽子150元,e:袜子50元
加入购物车a
是否结束加入购物车no
a:衣服500元,b:裤子400元,c:鞋子300元,d:帽子150元,e:袜子50元
加入购物车b
是否结束加入购物车yes
完成加入购物车
1400
是否购买yes/noyes
1400
是否继续逛下一家
[root@localhost opt]# sh test15.sh
是否进入这家店yes
进入这家店
a:衣服500元,b:裤子400元,c:鞋子300元,d:帽子150元,e:袜子50元
加入购物车a
是否结束加入购物车no
a:衣服500元,b:裤子400元,c:鞋子300元,d:帽子150元,e:袜子50元
加入购物车c
是否结束加入购物车no
a:衣服500元,b:裤子400元,c:鞋子300元,d:帽子150元,e:袜子50元
加入购物车d
是否结束加入购物车yes
完成加入购物车
950
是否购买yes/nono
是否继续逛下一家
作业2:某山顶上有一颗香蕉树,一只猴子第一天从树上摘了若干根香蕉,当即就吃了一半,还不过瘾,
又多吃了一根。第二天猴子又将剩下的香蕉吃了一半,禁不住诱惑,又多吃了一根香蕉。
依此类推,每天都将剩余的香蕉吃一半后再多吃一根。到了第十天,猴子发现只剩一根香蕉了,
请问这只猴子在第一天总共摘了多少根香蕉?
[root@localhost opt]# vim test17.sh
a=1
for ((day=1;day<10;day++))
do
a=$(((a+1)*2))
done
echo "第一天猴子总共摘了$a根香蕉"
[root@localhost opt]# sh test17.sh
第一天猴子总共摘了1534根香蕉
ono
是否继续逛下一家
作业2:某山顶上有一颗香蕉树,一只猴子第一天从树上摘了若干根香蕉,当即就吃了一半,还不过瘾,
又多吃了一根。第二天猴子又将剩下的香蕉吃了一半,禁不住诱惑,又多吃了一根香蕉。
依此类推,每天都将剩余的香蕉吃一半后再多吃一根。到了第十天,猴子发现只剩一根香蕉了,
请问这只猴子在第一天总共摘了多少根香蕉?
[root@localhost opt]# vim test17.sh
a=1
for ((day=1;day<10;day++))
do
a=
(
(
(
a
+
1
)
∗
2
)
)
d
o
n
e
e
c
h
o
"
第一天猴子总共摘了
(((a+1)*2)) done echo "第一天猴子总共摘了
(((a+1)∗2))doneecho"第一天猴子总共摘了a根香蕉"
[root@localhost opt]# sh test17.sh
第一天猴子总共摘了1534根香蕉