for循环学习(1)

一、循环和遍历

1.1 循环

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

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

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

1.2 遍历

遍历指的就是对数据结构中每个元素进行一次访问的过程。通常和循环一起使用。访问的目的就是为了执行特定的操作。

粗略地理解:循环就是操作,遍历就是输出。

1.3 循环的作用

  1. 重复执行代码,尤其是统一的,相同的,批量的操作。
  2. 提高代码的重复利用率。
  3. 提高人工的效率,减少人工干预。
  4. 简化程序的逻辑,降低代码出错的可能性。

1.4 几种循环方式

  • for循环:使用场景,一般用于已知循环次数的场景。

  • while循环:和for循环可以互相替换,常用于死循环。

  • until循环:until条件不满足才执行循环,条件满足,不执行。

二、for循环

2.1 for循环的几种格式

2.1.1 格式1
bash 复制代码
for 变量名称(不需要$) in 范围 {}
do
	命令序列
done

例:

bash 复制代码
for i in {1..10}
do
 echo $i
done
# 执行该文件会打印 1 到 10

例:

创建一个文件/opt/passwd.txt

在文件中创建三行:test1,test2,test3

使用循环创建这三个用户,统一设定密码为123456

bash 复制代码
vim l1.sh
for user in $(cat /opt/passwd.txt)
do
 useradd $user
 echo 123456 | passwd --stdin $user
done

sh l1.sh 
Changing password for user test1.
passwd: all authentication tokens updated successfully.
Changing password for user test2.
passwd: all authentication tokens updated successfully.
Changing password for user test3.
passwd: all authentication tokens updated successfully.
2.1.2 格式2

类C语言格式:

bash 复制代码
for ((表达式1;表达式2;表达式3))
do
	命令序列
done

例:

bash 复制代码
for ((i=0;i<5;i++))

表达式1:定义变量并赋予初始值,i=0;

表达式2:循环的范围

表达式3:循环的方式,变量每次自增1

bash 复制代码
例:1到100,求和
vim l2.sh
sum=0
for i in {1..100}
do
 sum=$(($sum+i))
done
echo $sum 

[root@test1 lesson2]# sh l2.sh 
5050
bash 复制代码
例:分别求1到100的奇数和,偶数和
vim l3.sh
sum1=0
sum2=0
for i in {1..100}
do
if [ $(($i%2)) -eq 0 ]
then
 sum1=$(($sum1+$i))
else
 sum2=$(($sum2+$i))
fi
done
echo "偶数和"$sum1 
echo "奇数和"$sum2 

sh l3.sh 
偶数和2550
奇数和2500
bash 复制代码
例:自定义输入一个数,然后求从1到该数字的累加和
vim l4.sh
read -p "输入一个数.范围1-100:" num
sum=0
for ((i=1;i<=$num;i++))
do
 sum=$(($sum+$i))
done
echo $sum
sh l4.sh 
输入一个数.范围1-100:10
sh l4.sh 
输入一个数.范围1-100:100
5050
2.1.3 格式3

死循环:会一直循环

bash 复制代码
for ((;;))
do
	命令序列
done

break

在循环内部,执行到break命令时,会立即跳出当前循环,并终止

continue

在循环内部,当执行到continue,跳出当前循环,如果后续条件依然满足,会继续进行

死循环的应用

例:猜数字,输入一个1-100的随机数,这个随机数由系统生成,每次猜提示猜大了还是猜小了,猜中则提示猜中了,并统计一共猜了多少次。

用死循环,一直到用户猜中为止,猜中了循环才会终止

随机数生成用变量$RANDOM,随机数范围0-32767

需要取0-99的随机数 ,只要用$RANDOM%100除以100的余数再加1即可实现。

bash 复制代码
vim l5.sh
ran=$((RANDOM%100+1))
count=0
for ((;;))
do
read -p "请输入数字,1-100:" num
let count++
if [ $num -gt $ran ]
then
 echo "猜大了"
elif [ $num -lt $ran ]
then
 echo "猜小了"
elif [ $num -eq $ran ]
then
 echo "猜中了,猜了$count次"
 break
fi
done

解释: let t++,即让变量count每次循环自增一。

2.2 练习

  1. 购物例题:

    逛淘宝选购商品,每家商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元),每次选购完或不买都会提示用户是否继续逛下一家商店,

    如果不再继续逛的话进行购物车结算总额。

    vim shopping.sh

    bash 复制代码
    sum=0
    for ((;;))
    do
    echo "欢迎光临本店!本店商品价格:"
    echo "衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元"
     read -p "输入要买的商品{1.衣服|2.裤子|3.鞋子|4.帽子|5.袜子|6.不想要了}" item
     case $item in
     "1")
     cost=500
     ;;
     "2")
     cost=400
     ;;
     "3")
     cost=350
     ;;
     "4")
     cost=150
     ;;
     "5")
     cost=50
     ;;
     "6")
     cost=0
     ;;
     *)
     cost=0
     echo "输入错误,请重试"
     esac
     sum=$(($sum+$cost))
     
     read -p "是否要继续购买?1.继续|2.离开:" s1
     if [ $s1 -eq 1 ]
     then
     continue
     elif [ $s1 -eq 2 ]
     then
     read -p "是否继续逛下一家商店?1.继续|2.离开:" s2
      if [[ $s2 -eq 1 ]]
      then
      continue
      elif [[ $s2 -eq 2 ]]
      then
      echo "当前购物车总额:${sum}元"
      break  
      else                                                                                              
      echo "输入错误,请重试" 
      fi
     else
     echo "输入错误,请重试" 
     fi 
    done
    bash 复制代码
    sh shopping.sh 
    欢迎光临本店!本店商品价格:
    衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元
    输入要买的商品{1.衣服|2.裤子|3.鞋子|4.帽子|5.袜子|6.不想要了}1
    是否要继续购买?1.继续|2.离开:1
    欢迎光临本店!本店商品价格:
    衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元
    输入要买的商品{1.衣服|2.裤子|3.鞋子|4.帽子|5.袜子|6.不想要了}5
    是否要继续购买?1.继续|2.离开:2
    是否继续逛下一家商店?1.继续|2.离开:2
    当前购物车总额:550 元
  2. 某山顶上有一颗香蕉树,一只猴子第一天从树上摘了若干根香蕉,当即就吃了一半,还不过瘾,又多吃了一根。第二天猴子又将剩下的香蕉吃了一半,禁不住诱惑,又多吃了一根香蕉。

    依此类推,每天都将剩余的香蕉吃一半后再多吃一根。到了第十天,猴子发现只剩一根香蕉了,

    请问这只猴子在第一天总共摘了多少根香蕉?

    vim monkey.sh

    bash 复制代码
    sum=1
    for ((i=9;i>=1;i--))
    do
    sum=$((($sum+1)*2))
    echo "第${i}天开始时有${sum}根香蕉"
    done
    bash 复制代码
    sh monkey.sh 
    第9天开始时有4根香蕉
    第8天开始时有10根香蕉
    第7天开始时有22根香蕉
    第6天开始时有46根香蕉
    第5天开始时有94根香蕉
    第4天开始时有190根香蕉
    第3天开始时有382根香蕉
    第2天开始时有766根香蕉
    第1天开始时有1534根香蕉
相关推荐
QMCY_jason23 分钟前
Ubuntu 安装RUST
linux·ubuntu·rust
慕雪华年27 分钟前
【WSL】wsl中ubuntu无法通过useradd添加用户
linux·ubuntu·elasticsearch
苦逼IT运维42 分钟前
YUM 源与 APT 源的详解及使用指南
linux·运维·ubuntu·centos·devops
仍有未知等待探索1 小时前
Linux 传输层UDP
linux·运维·udp
zeruns8021 小时前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站
卑微求AC1 小时前
(C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)
linux·c语言·开发语言·嵌入式·c语言贪吃蛇
Hugo_McQueen1 小时前
pWnos1.0 靶机渗透 (Perl CGI 的反弹 shell 利用)
linux·服务器·网络安全
XY.散人2 小时前
初识Linux · 文件(1)
linux·运维·服务器
叶北辰CHINA3 小时前
nginx反向代理,负载均衡,HTTP配置简述(说人话)
linux·运维·nginx·http·云原生·https·负载均衡
不惑_3 小时前
在 Ubuntu 安装 Python3.7(没有弯路)
linux·运维·ubuntu