文章目录
循环
1 循环的概述
循环是一种重复执行一段代码的结构,通过循环,可以在满足一定条件的情况下,多次的执行相同的代码。
循环会有一个循环体(代码)和循环条件(执行代码的次数),循环一定要有一个终点(不能是条件永远满足,否则就是死循环)。
循环的作用:
1、重复一段代码,提高工作效率。
2、提高代码的复用率。
3、提高程序的效率。
2 for 循环
for 循环是最主要的,也是最常用的循环语法。 用于已知次数的循环。
2.1 普通格式
for 变量名 in {1..5}
do
循环体 (可执行代码)
done
2.2 for实现死循环
for((;;)) #条件永远为真
do
代码
done
2.3 类c语言格式
for ((表达式1: 表达式2: 表达式3))
do
代码
done
例:
for ((i=1;i<=5;i++))
do
echo $i
done
#表达式1:循环的初始条件 1
#表达式2:循环的条件:1 2 3 4 5
#表达式3:循环条件的变化:i++ 每一次循环完成之后,i的值,自增1
2.4 例题
2.4.1:用循环的方式,给系统批量的添加这5个用户名,统一的初始密码是123456
for user in $(cat /opt/user.txt)
do
useradd -m -s /bin/bash $user
echo "$user:123456" | chpasswd
done
2.4.2:累加求和1+2+3+4+5+6+7+8+9+10=?
sum=0
for i in {1..10}
do
sum=$(($sum+$i))
done
echo $sum
2.4.3:累加求和1-100,分别求出奇数和以及偶数和?
sum1=0
sum2=0
for i in {1..100}
do
if [ $(($i%2)) = 1 ]
then
sum1=$(($sum1+$i))
else
sum2=$(($sum2+$i))
fi
done
echo $sum1
echo $sum2
2.4.4:99乘法表
for i in {1..9}
do
for ((j=1;j<=i;j++))
do
echo -ne "$i*$j=$(($i*$j))\t"
done
echo
done
2.4.5:倒等腰三角形
for i in {1..9}
do
for ((j=1;j<i;j++))
do
echo -n " "
done
for ((k=9;k>=i;k--))
do
echo -n "*"
done
for ((l=8;l>=i;l--))
do
echo -n "*"
done
echo
done
2.4.6:遍历目录下所有文件
for file in /opt/*.txt
do
cat $file >> /opt/test
done
2.4.7:用户输入密码,脚本来判断密码是否正确,正确的是123456,输入正确提示用户,连续输入错三次以上提示:
b="123456"
for ((i=1;i<=3;i++))
do
read -s -p "请输入密码:" a
if [ "$a" == "$b" ]
then
echo "密码输入正确!"
exit
else
echo "密码输入错误!"
fi
done
echo "警告:您已输错3次密码!"
2.4.8:自定义输入一个网段 ,然后ping整个网段,保留可用的地址到/opt/hosts,ping不通提示不通即可,同时不显示ping的过程
read -p "请输入一个网段(例:192.168.159.):" a
for ((i=1;i<=254;i++))
do
{
ping -c3 "${a}${i}" &> /dev/null
if [ $? = 0 ]
then
echo "${a}${i}" >> /opt/hosts
echo "${a}${i}可用"
else
echo "${a}${i}不可用!"
fi
}&
# {}将整个执行语句作为一个整体,&表示并行处理
done
wait
# 执行结束之后不等待,直接退出
2.5 echo的补充用法
echo
-n: 表示不换行输出,所有的结果展示在一行
-e: 支持转义符
选项 | 作用 |
---|---|
\r | 光标移至行首,并且不换行 |
\s | 当前shell的名称,如bash |
\t | 插入Tab键,制表符 |
\n | 输出换行 |
\f | 换行,但光标仍停留在原处 |
\\ | 表示插入"\"本身转义 |
\b | 表示退格 不显示前一个字符 |
\c | 抑制更多的输出或不换行 |
bash -x 脚本 查看脚本运行时的具体情况
2.6 循环进行控制
- exit:当满足条件时,整个进程都会终止,后续的代码也不再执行
- break:当满足条件时,循环也会终止,后续的代码也不执行,break后面的数字模式1,表示控制当前的循环,2表示控制2层进程也会终止。
- continue:只会跳出当前满足条件的这一次循环,后续的条件依然满足,循环还要继续执行
当前满足一定条件时,对循环的下一步执行进行控制
2.7 综合题:逛淘宝选购商品
商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元),
每次选购完商品之后,提示用户是否继续,是/否,输入不是指定的内容,提示用户输入有误,循环不能终止,选择停止购物,要结算总的金额。
cost=0
echo "欢迎光临坤坤服饰公司
本店的商品有:
衣服(500元)
裤子(400元)
鞋子(350元)
帽子(150元)
袜子(50元)"
for ((;;))
do
read -p "请问您是否想买点什么(y/n):" c
if [ "$c" == y ]
then
for ((;;))
do
echo "1.衣服(500元)
2.裤子(400元)
3.鞋子(350元)
4.帽子(150元)
5.袜子(50元)"
read -p "请输入您想要购买的商品编号(1-5):" b
case $b in
1)
cost=$(($cost+500))
echo "您购买了一件500元的衣服"
break
;;
2)
cost=$(($cost+400))
echo "您购买了一条400元的裤子"
break
;;
3)
cost=$(($cost+300))
echo "您购买了一双300元的鞋子"
break
;;
4)
cost=$(($cost+150))
echo "您购买了一顶150元的帽子"
break
;;
5)
cost=$(($cost+50))
echo "您购买了一双50元的袜子"
break
;;
*)
echo "输入有误,请输入编号“1-5”"
esac
done
for ((;;))
do
read -p "请问您是否选择继续购物(y/n):" a
if [ "$a" == y ]
then
for ((;;))
do
echo "1.衣服(500元)
2.裤子(400元)
3.鞋子(350元)
4.帽子(150元)
5.袜子(50元)"
read -p "请输入您想要购买的商品编号(1-5):" b
case $b in
1)
cost=$(($cost+500))
echo "您购买了一件500元的衣服"
break
;;
2)
cost=$(($cost+400))
echo "您购买了一条400元的裤子"
break
;;
3)
cost=$(($cost+300))
echo "您购买了一双300元的鞋子"
break
;;
4)
cost=$(($cost+150))
echo "您购买了一顶150元的帽子"
break
;;
5)
cost=$(($cost+50))
echo "您购买了一双50元的袜子"
break
;;
*)
echo "输入有误,请输入编号“1-5”"
esac
done
elif [ "$a" == n ]
then
echo "您本次消费了$cost元。
非常感谢您的光顾,欢迎您下次光临!"
exit
else
echo "输入有误,请输入“y”或“n”"
fi
done
elif [ "$c" == n ]
then
echo "谢谢光临!"
exit
else
echo "输入有误,请输入“y”或“n”"
fi
done
3 while
3.1 while格式
while [判断条件]
do
代码
done
在循环体外定义一个初始值
i=1
while [ $i -le 5 ]
do
echo $i
let i++
#让变量发生变化以达到条件不满足的情况,终止循环。
done
#while的死循环的语法:
while true
do
代码
done
while :
do
代码
done
while [ 1 -eq 1 ]
do
代码
done
3.2 例题
3.2.1:100以内的整数奇偶累加求和
i=1
sum1=0
sum2=0
while [ $i -le 100 ]
do
if [ $(($i%2)) = 1 ]
then
sum1=$(($sum1+$i))
else
sum2=$(($sum2+$i))
fi
let i++
done
echo $sum1
echo $sum2
3.2.2:猜数字,for或者while写一个死循环,随机生成一个数1-00,用户要一直猜这个数字,直到猜对了才可以退出
a=$((RANDOM%100+1))
b=0
echo "欢迎来到猜数小游戏
系统将会随机生成一个1~100的数"
for ((;;))
do
read -p "请输入您猜的数字:" i
let b++
if [ "$i" == "$a" ]
then
echo "恭喜您猜对了!您一共猜了 $b 次"
exit
elif [ "$i" -gt "$a" ]
then
echo "您猜的数大了"
elif [ "$a" -gt "$i" ]
then
echo "您猜的数小了"
fi
done
3.2.3:实现计算器,能够实现整数运算:+ - * / %
while true
do
read -p "输入第一个数:" num1
read -p "输入运算符(+,-,*,/,%):" a
read -p "输入第二个数:" num2
if [ "$a" == "/" ] || [ "$a" == "%" ]
then
if [ $num2 -eq 0 ]
then
echo "错误,除数不能为0"
continue
fi
fi
result=`echo $(($num1 $a $num2))`
echo "计算的结果是$result"
done
4 until
4.1 until格式
until: 不满足条件才进行循环,一旦条件成立,循环立刻终止
until [判断条件]
do
代码
done