循环

循环

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值