shell脚本(三)——循环语句之for、while语句

一.for循环语句

在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清 单检查各主机的存活状态。
当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代 码更是显得异常烦琐、困难重重,所以for的出现让程序变得简单明了。

1.1for循环结构

功能:读取不同的变量值,用来逐个执行同一组命令
语法结构:

1)列表循环
(2)不带列表循环
(3)类C风格的for循环
for  变量名 in  取值列表
do
   命令序列
done

在这里插入图片描述

1.2 经典for语句案例

1.2.1 显示打印输出1-6

for i in `seq 6`   //seq 6=1、2、3、4、5、6序列
do      
        echo $i
done

在这里插入图片描述

在这里插入图片描述

1.2.2 调用显示i的值

for i in a b c    //这里调用到i变量了,所以就正常显示i的值(a\b\c)
do
        echo $i
done

在这里插入图片描述

1.2.3 输出0到20之间的偶数和奇数

花括号{}和seq在for循环的应用:

for i in {1…50…2} 1-50的奇数

for i in {2…50…2} 1-50的偶数

for i in {10…1} 1-10倒序排列

for i in $(seq 10) 1-10正序排列

for i in $(seq 10 -1 1) 1-10倒序排列

for i in $(seq 1 2 10) 1-10的奇数,中间为步长

#!/bin/bash
#for循环倒取020的偶数
for i in {
    
    20..0..2}
do
  echo $i
done

echo "一下是奇数:"
#for循环取020的奇数
for i in {
    
    1..20..2}
do
  echo $i
done

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
eg2:
在这里插入图片描述

在这里插入图片描述

1.2.4 不带列表循环执行时由用户指定参数和参数的个数决定的

for 变量名 
do
    command
done

eg1:
在这里插入图片描述
在这里插入图片描述
eg2:

[root@zhang ~]# vim for2.sh 

#!/bin/bash
for i
do
        echo hello
done

[root@zhang ~]# . for2.sh   //没有给脚本传参所以执行了没有结果

[root@zhang ~]# . for2.sh a   //把a赋值给变量i,i有值了它就开始执行do..done了
hello

在这里插入图片描述

1.2.5 批量创建用户,并设置密码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.6 根据ip地址列表检查主机状态

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.7 判断密码输入是否正确!

在这里插入图片描述
在这里插入图片描述

1.2.8 幸运会员抽奖

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 类C风格的for循环

格式:

for ((expr1;expr2;expr3))
do
       command
done

expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出

1.3.1 显示输出1-5

#!/bin/bash
for((i=1;i<=5;i++)) #此时你要注意只要有i++ 就要有两个括号
 do
   echo $i
done

在这里插入图片描述
在这里插入图片描述

1.3.2 嵌套循环 星星的格式

#!/bin/bash
read -p "请输入星星的规格:" start
for ((i=1;i<=$start;i++))
do
  for ((j=1;j<=$start;j++))
      do
       echo -n "*"
      done
echo 
done

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把星星变成三角形的格式:

#!/bin/bash
read -p "请输入星星的规格:" start
for ((i=1;i<=$start;i++))
do 
  for ((j=1;j<=$i;j++))
      do
       echo -n "*"
      done
echo 
done

在这里插入图片描述
在这里插入图片描述

1.3.3 9 9乘法表

#!/usr/bin/env bash

for ((a=1;a<=9;a++))
do
        for ((b=1;b<=9;b++))
        do
        if [[ a -ge b ]];then
                echo -n "$b*$a=$[a*b] "
        fi
        done
        echo " "
done

在这里插入图片描述

#!/usr/bin/env bash

for ((b=1;b<=9;b++))
do
        for ((a=1;a<=9;a++))
        do
        if [[ a -ge b ]];then
                echo -n "$b*$a=$[a*b] "
        fi
        done
        echo " "
done

在这里插入图片描述
在这里插入图片描述

1.3.4 随机生成密码(达到一定复杂度)

#!/bin/bash
key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@#¥%%…………&&**(())————+"
num=${
    
    #key}
pass=''
for i in {
    
    1..6}
  do
     index=$[RANDOM%num]
     pass=$pass${
    
    key:$index:1}
  done
echo "随机生成的密码时:$pass"

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
法二:随机生成密码

#!/bin/bash
mkpasswd -l 6 -s 1 -C 1 -c 1 -d 1
#  -c:定义在密码中小写字母字符的最小数目,默认值是2
#  -C:定义在密码中大写字母字符的最小数目,默认值是2
#  -s:定义在密码中特殊字符的最小数目,默认值是1
#  -p:指定程序来设置密码,默认情况下,如果存在使用/etc/yppasswd,否则使用/bin/passwd
#  -d:定义密码的最小数目,默认值为2
#  -l:定义口令的长度,默认值为9

在这里插入图片描述
在这里插入图片描述

二.while语句

1、语法结构

while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
先定义一个变量
while 表达式(条件)
do
    循环语句命令
done

2.1 经典案例

2.1.1 打印1-5

[root@zhang ~]# vim while.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
    echo $i
    let i++   //注意这里如果不改变$i的值,会变成死循环
done

在这里插入图片描述

let :相当于 简单的计算器

**语 法**
let[计算表达式]
**功 能**
let 命令:是 BASH中用于计算的工具,提供常用运算符还提供了方幂“**”运算符。在变量的房屋计算中不需要加上$来表示变量,如果表达式的值是非0,那么返回的状态值是0;否则,返回的状态值是1

2.1.2 输出1到100能被3整除的数字

#!/bin/bash
i=1
while [ $i -le 100 ]
do
    if [[ $i%3 -ne 0 ]]
      then
        echo "$i"
    fi
    let i++
done

在这里插入图片描述

2.2.3 开启apache服务

#!/bin/bash
while ps aux |grep httpd |grep -v grep &>/dev/null
 #ps aux 动态查找所有进程 grep httpd :过滤显示出带有httpd字段的  最>-v:取反 反向查找,过滤掉带有grep字段的
  do
     echo "Apache 服务正在运行中"
     sleep 2  #睡眠两秒
  done
echo "Apache 服务不在运行,请查看服务是否出现故障"

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2.4 猜数字的案例,猜不对就一直猜,猜对了退出

while里面解决死循环的方法,用break退出循环

#!/bin/bash
cnum=520
while true
do
read -p "请输入数字:" num
    if [ $num -eq $cnum ];then
         echo "你猜对了!"
         break
    elif [ $num -gt $cnum ];then
       echo "你猜的数字过大啦!"
    elif [ $num -lt $cnum ];then
       echo "你猜的数字过小啦!"
    fi
done

在这里插入图片描述
在这里插入图片描述

2.2.5 猜商品价格

[root@localhost ~]# cat test7.sh 
#!/bin/bash
PC=`expr $RANDOM % 1000`
a=0
echo "商品实际价格范围0-999,请猜猜看是多少?"
 
while true
do 
read -p "请输入你猜的价格数目:" num
let a++
if [ $num -eq $PC ];then
   echo "恭喜你答对了,实际价格是 $PC "
   echo "你总共猜了$a次"
   exit 0  #退出
elif [ $num -gt $PC ];then
   echo "小可爱,你猜高啦!"
else 
   echo "小可爱,你猜低啦!"
fi

done

在这里插入图片描述
在这里插入图片描述

2.2.6 监控系统资源中的内存和硬盘空间

#!/bin/bash
disk_size=$( df / |awk '/\//{print $4 }') #硬盘的可用空间
Mem_size=$(free | awk '/Mem/{print $4}')  #分区的可用空间
while
do
  if [ $disk_size -le 2560000 -a $Mem_size -le 102400 ];then
       mail -s Warning root <<EOF
       内存和硬盘空间不足请尽快处理!
EOF

#EOF是免交互模式,直接把东西传给邮箱进行警告#注意EOF必须要顶格写才能成功
  fi
Done

在这里插入图片描述
在这里插入图片描述

2.2.7 break与continue的区别

#break 3 表示单个循环后面数字3表示跳出三层循环
#continue 表示终止每次循环的命令,但是不会完成终止命令

1.break
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.break
在这里插入图片描述
在这里插入图片描述

2.2.8 商店购物 并打折

#!/bin/bash
i=1
sum=0
while [ $i -le 5 ]
do
  echo "本公主今天宠爱第$i家商店呢"
  read -p "是否进入看看(yes/no)" doing
  while [ $doing = "yes" ]
    do
       echo "1:衣服 ¥200"
       echo "2:鞋子 ¥150"  
       echo "3:帽子 ¥50"
       echo "4:裤子 ¥165"
      read -p "请选择需要购买的商品序列号:" num
        case $num in
        1)
          echo "衣服购买成功!"
          expr $[ sum+=200 ] &> /dev/null
        ;;
        2)
          echo "鞋子购买成功!"
          expr $[ sum+=150 ] &> /dev/null
        ;;

        3)
          echo "帽子购买成功!"
          expr $[ sum+=50 ] &> /dev/null
        ;;

        *)
          echo "裤子购买成功!"
          expr $[ sum+=165 ] &> /dev/null
        ;;
        esac
           read -p "是否继续进行购买(yes/no)" doing
     done
let i++
        if [ $doing = "no" ]
           then continue
        fi
done
echo "今天您的购物总价为:$sum"

if [ $sum -ge 150 ] && [ $sum -lt 200 ];then
    let sum=sum-50
elif [ $sum -ge 200 ] && [ $sum -le 400 ];then
    let sum=$sum-100
fi
echo "打折之后的价格为:$sum"   

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三. until 循环语句结构

用法: 重复测试某个条件,只要条件不成立则反复执行

只要while后面的命令退出状态为0,while循环就一直执行下去,until命令与while命令相似,唯一的区别在于,只要until后面的命令退出不为0,until循环就一直执行下去,也就是说,使用until语句重复执行一段代码直到条件为真为止,与while类似

格式:
until 条件测试操作
do
 命令序列
done

3.1 计算0-50的和?

通过循环累加的方式计算1-50的和

#!/bin/bash
#功能10-50的和是多少?
#i=0;s=0
#until [ $i -eq 51 ]
#do
 #   let s+=i
  #  let i++
#done
#echo $s

在这里插入图片描述
在这里插入图片描述

福利待遇:编写脚本的思路

1.首先明确脚本的功能
   1.1案例:需求是创建用户并测试用户20->那肯定要用循环forwhile
                 ->知道需求含义来定义脚本的功能
   
2.编写脚本时会使用到哪些命令?
   2.1如上面的需求:就要使用useradd  passwd  let  echo  for  while 等命令

3.把变化的数据使用变量表示【记得要先定义哦】
   3.1固定长的定义变量、经常调用的参数可设变量
   3.2变化的定义变量

4.选择适合的流程控制
4.1【循环语句、双分支、多分支、case等一些控制语句 】

喜欢小编就给我点个赞吧!

猜你喜欢

转载自blog.csdn.net/weixin_59663288/article/details/124453311
今日推荐