shell脚本之循环语句

一、for 循环语句

1、语法结构

(1)列表循环
(2)不带列表循环
(3)类C风格的for循环

格式:

for  变量名  in  取值列表
do
	命令序列
done
for ( (expr1;expr2;expr3))
do
command
done


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

2、用法

读取不同的变量值,用来逐个执行同一组命令

for循环经常使用在已经知道要进行多少次循环的场景
在这里插入图片描述

3、例子

打印1到5

[root@ky19cl for]# for i in {1..5}
> do
> echo $i
> done
1
2
3
4
5
[root@ky19cl for]# for i in `seq 5`
> do
> echo $i
> done
1
2
3
4
5

在这里插入图片描述
打印0到50的偶数

#!/bin/bash
for i in {0..50..2]   #..2代表步长为2,每隔2个
do
echo $i
done

1到10的偶数和

#/bin/bash
sum=0
for i in {0..10..2}
do
  sum=$[sum+i]
  let i++
done
echo "10以内的偶数和为:$sum"

小知识点:
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的奇数,中间为步长

for i in s (seq 0 2 10) 1-10的偶数,中间为步长

循环输出1到5

#!/bin/bash
for  ((i=1;i<=5;i++) )do
echo $i
done

注: 
i++ :  i=1+1  先赋值再运算  i=1  之后再 +1
++i :  1+1=i  先运算再赋值  1+1  之后再 =i

批量创建用户
方法一:

#!/bin/bash
for i in {1..5}`seq 5`
do
useradd cl$i
echo "123456" | passwd --stdin cl$i
done

方法二:
先创建一个名单为users.txt在home目录下

#!/bin/bash
UL=$(cat /home/users.txt)
for UNAME in $UL
do
useradd  $UNAME
echo "123456" | passwd --stdin $UNAME &>/dev/null
done

批量删除用户

#!/bin/bash
UL=$(cat /home/users.txt)
for UNAME in $UL
do
userdel -r $UNAME &>/ dev/ null
done

根据IP地址列表检查主机状态
-c发送包的数量
-i发送ping包间隔
-W超时时间

创建一个ip.txt文档在home目录下
#!/bin/bash
HLIST=$(cat /home/ip.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ];then
echo "Host $IP is up."
else
echo "Host $IP is down . "
fi
done
#!/bin/bash
network="192.168.10"
for addr in { 1..254 }
do
ping -c 2 -i 0.5 -w 3 $network.$addr &> /dev/null
if [ $? -eq 0 ] ;then
echo " $network. $addr is up"
else
echo "$network.$addr is down"
fi
done

密码验证,允许输入三次密码

#!/bin/bash
init=123456
for i in {1. .3}
do
read -p "请输入密码:" pass
if  [ $pass == $init ] ; then
echo “密码正确"
exit
fi
done
echo“警告:密码错误"

在这里插入图片描述

抽奖次数

[root@ky19cl for]# vim chouhuiyuan.sh 

#!/bin/bash
a=0
b=0
c=0
d=0
for ((i=1;i<=10;i++))
do
        num=$(expr $[RANDOM%4+1])
        LIST=$(cat user.txt |grep "$num" | awk -F: '{print $2}')
          case $LIST in
          cl)
          let a++
                ;;

          xlm)
          let b++
                ;;

          zzl)
          let c++
                ;;

          *)
          let d++
                ;;
        esac

done
 echo "cl: $a次、 xlm:$b次、zzl:$c次、其他:$d次 "

在这里插入图片描述

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

循环嵌套

九九乘法表

#!/bin/bash
for ((x=1;x<=9;x++))
do
	for ((y=1;y<=9;y++))
	do
 	[ $y -le $x ] && echo -n " $x*$y=`echo $(($x*$y))` "
	done
echo ""
done

在这里插入图片描述

打印星星

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

echo
done

在这里插入图片描述

二、while 循环语句

1、while循环

一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环

2、用法

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

常在不知道范围的时候成立

格式:

while 条件测试操作
do
	命令序列
done

在这里插入图片描述

3、例子

打印1到5,最后输出为6

#!/bin/bash
i=1
while [ $i -le 5 ]
do
    echo $i
    let i++   #注意这里如果不改变$i的值,会变成死循环
#i=$[$i+1]  //两种写法
done
echo "最后i的值为: $i"

100内不能被3整除

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

在这里插入图片描述

查看服务是否正常

#!/bin/bash
while ps aux | grep httpd | grep -v grep &> /dev/null
do
echo "httpd服务正在运行中"
sleep 2
exit
done
echo "httpd服务不在运行中,查看是否有故障"

在这里插入图片描述

while死循环
在这里插入图片描述

猜价格一
在这里插入图片描述
猜价格二

PC=`expr $RANDOM % 1000`
a=0
echo "猜价格0-999"
while true
do
read -p "请输入猜的价格:" num
let a++
if [ $num -eq $PC ];then
	echo "恭喜你,猜对了,价格为$num"
	echo "猜了$a次"
	exit 0

elif [ $num -gt $PC ];then

	echo "猜高了" 
else 
	echo "猜低了"


fi

done

在这里插入图片描述
创建20个用户

#!/bin/bash
USERS="cl"
i=1
while [ $i -le 20 ]
do
	useradd ${USERS}$i
	echo "123456" |passwd --stdin ${USERS}$i
	let i++
done

实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M 时,发送报警邮件给 root 管理员

#!/bin/bash
#提取根分区剩余空间
disk_size=$(df / |awk '/\//{print $4}')
#提取内存剩余空间
mem_size=$(free |awk '/Mem/{print $4}') 
while :
do
#注意内存和磁盘提取的空间大小都是以Kb 为单位
if [ $disk_size ‐le 512000 -a $mem_size ‐le 1024000 ];then 
mail ‐s Warning root <<EOF
Insufficient resources,资源不足
EOF
fi 
done

逛商店

#!/bin/bash
sum=0
i=1
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"

在这里插入图片描述

三、until 循环语句

跟while相反,条件为假进入循环,条件为真退出循环

用法: 重复测试某个条件,只要条件不成立则反复执行
在这里插入图片描述

例子:
计算1到51的和

#!/bi/bash
set -x
i=0
s=0
until [ $i -eq 51 ]
do
        let s=s+i
        let i++
done
echo $s

在这里插入图片描述
用户案例

#!/bin/bash
username=$1
#判断信息格式
if [ $# -lt 1 ];then
  echo "Usage:`basename $0` <username> [<message>]" 
  exit 1
fi
#判断用户是否存在
if grep "^$username:" /etc/passwd >/dev/null ;then : 
else
   echo "用户不存在"
   exit 1
fi
#用户是否在线,如果不在线每5秒联系一次
until who|grep "$username" >/dev/null
do
	echo "用户不存在"
        sleep 5
done
mes=$* 
echo $mes | write $username
注:测试时切换下用户

四、循环控制语句

1、continue

终止每次循环中的命令,但不会完全终止命令

#!/bin/bash
for ((i=1;i<=5;i++))
do
        if [ $i -eq 3 ];then
        continue
        else
        echo $i
        fi
done

结果是1245,3不输出,因为跳出后面的echo语句执行下一次循环了
在这里插入图片描述

2、break

打断,马上停止本次循环,执行循环体外的代码
1-10的数字,7后面的都不打印

#!/bin/bash
for ((i=1;i<=10;i++))
do
        if [ $i -eq 8 ];then
        break
        else
        echo $i
        fi
done

1-10的数字,7后面的都不打印
在这里插入图片描述

3、exit

直接跳出程序,后面可跟状态返回码如 exit 1

#!/bin/bash
for i in {1..5}
do
if [ $i -eq 3 ];then
        exit  1 
else
        echo $i
fi

done
echo $i

在这里插入图片描述
exit 数字
echo $?可以查看

嵌套循环例子跳出多层循环

#!/bin/bash
for ((a=1;a<=3;a++))
do
echo "outer loop: $a" 
 for ((b=1;b<=4;b++))
 do
 if [ $b -eq 3 ];then
 continue 2
 #break 2
 fi
echo "inter loop: $b"
 done
done

continue与continue 2
在这里插入图片描述
break与break 2

在这里插入图片描述

总结

编写脚本的思路
1、明确脚本的功能实现功能
比如:需求创建测试用户20个

2、编写脚本时会使用到哪些命令?
useradd、 paswwd 、for、 let、 echo

3、把变化的数据使用变量表示

  • 固定长的定义变量、经常调用参数可设变量
  • 变化的定义变量

4、选择适合的流程控制语句,循环、双分支、多分支、case等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值