31、shell循环

一、循环

循环:循环是一种重复执行一段代码的结构。只要满足循环的条件,会一直执行这个代码。

循环条件:在一定范围之内,按照指定的次数来执行循环。

循环体:在指定的次数内,执行的命令序列。只要条件满足,循环体会被一直执行。

循环和遍历:

遍历值得就是对数据结构中每个元素进行一次访问的过程。通常和循环一起使用。

访问的目的:就是为了执行特定的操作

循环是操作

遍历就是输出

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根香蕉


相关推荐

  1. shell--while循环

    2024-06-13 19:36:03       40 阅读
  2. shell--for循环

    2024-06-13 19:36:03       35 阅读
  3. shell循环控制

    2024-06-13 19:36:03       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-13 19:36:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-13 19:36:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-13 19:36:03       87 阅读
  4. Python语言-面向对象

    2024-06-13 19:36:03       96 阅读

热门阅读

  1. Chrome DevTools开发者调试工具

    2024-06-13 19:36:03       29 阅读
  2. 从零制作一个ubuntu的docker镜像

    2024-06-13 19:36:03       32 阅读
  3. 在 Ubuntu 上取消登录密码和锁屏功能的简易指南

    2024-06-13 19:36:03       40 阅读
  4. MySQL(2)

    2024-06-13 19:36:03       23 阅读
  5. AForge.NET介绍

    2024-06-13 19:36:03       25 阅读
  6. tar cjf xx.tar.bz2 xx,命令参数的含义

    2024-06-13 19:36:03       30 阅读
  7. MySQL bin-log日志恢复数据

    2024-06-13 19:36:03       32 阅读
  8. LVS ipvsadm命令的使用(二)

    2024-06-13 19:36:03       28 阅读
  9. CVE-2020-1472域渗透 NetLogon 权限提升漏洞

    2024-06-13 19:36:03       34 阅读
  10. 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件

    2024-06-13 19:36:03       32 阅读
  11. Android 调用系统相册、系统相机拍照

    2024-06-13 19:36:03       26 阅读
  12. 新视野大学英语2 词组 6.13

    2024-06-13 19:36:03       33 阅读