一、for循环语句

for循环语句结构

(1)for循环有三种结构:
第一种是列表for循环。
第二种是不带列表for循环。
第三种是类C风格的for循环。

for 变量名 in 取值列表
do                   
   命令序列
done

在这里插入图片描述
do和done之间的命令称为循环体,执行次数和list列表中常数或字符串的个数相同。for循环,首先将in后list列表的第一个常数或字符串赋值给循环变量,然后执行循环体,以此执行list,最后执行done命令后的命令序列。

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

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

它的运行过程为:
1)先执行exp1。
2)再执行exp2,如果它的判断结果是成立的,则执行循环体中的语句,否则结束整个for循环。
3)执行完循环体后再执行exp3。
4)重复执行步骤2)和3),直到exp2的判断结果不成立,就结束循环。
上面的步骤中,2)和3)合并在一起算作一次循环,会重复执行,for语句的主要作用就是不断执行步骤2}和3)

例:
打印1-3

#!/bin/bash
#for i in {1..3}
#do
#	echo $i
#done 

#for i in `seq 3`
#do 
#	echo $i
#done

for i in a  b c
do
	echo 1 2 3
done

在这里插入图片描述

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

在这里插入图片描述
注意:
i+=1和i=i++
i++ : i=1+1 先赋值再运算 i=1 之后再 +1
++i : 1+1=i 先运算再赋值 1+1 之后再 =i

打印0-8以内的偶数

#!/bin/bash
for i in {0..8..2}
do
        echo $i
done

在这里插入图片描述
计算0-8 以内的偶数和

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

在这里插入图片描述

将0-8倒序排列

#!/bin/bash
for i in {8..0}
do
        echo $i 
done

在这里插入图片描述
批量创建用户

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

查看
tail -7 /etc/passwd

创建不同用户并设置密码
提前在/home目录中创建users.txt

#!/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地址列表检查主机状态
首先先创建一个ip.txt 并输入需要检测的IP地址

#!/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

在这里插入图片描述
-c发送包的数量
-i发送ping包间隔
-w超时时间

密码验证
允许输入三次

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

抽奖
先创建一个users.txt
在这里插入图片描述

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

          gcl)
          let b++
                ;;

          sgcl)
          let c++
                ;;

          wbcl)
          let d++
                ;;
        esac
echo "$LIST"
done
 echo "cl: $a次、 xlm:$b次、zzl:$c次、wbcl:$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

在这里插入图片描述
打印星星
在这里插入图片描述

二、while 循环语句

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

在这里插入图片描述

执行过程:while将测试exp的返回值,如果返回值为true则执行循环体的命令,返回值为false则不执行循环。循环完成后会进入下一次循环之前将再次测试。

如果已知循环次数,可以用计数的方式控制循环,在达到规定的循环次数后退出循环。

例:
打印1——5并输出最后的值
在这里插入图片描述
打印出10以内不能被3整除的数

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

在这里插入图片描述

查看Apache服务是否正常

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

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

[root@node home]# while [ 1 -eq 1 ];do echo “gogogo”;done
在这里插入图片描述

猜数字

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

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

#!/bin/bash
price=`expr $RANDOM % 10`
a=0
echo "猜价格0-10"
while true
do
read -p "请输入猜的价格:" num
let a++
if [ $num -eq $price ];then
	echo "恭喜你,猜对了,价格为$num"
	echo "猜了$a次"
	exit 0
elif [ $num -gt $price ];then
	echo "猜高了" 
else 
	echo "猜低了"
fi
done

在这里插入图片描述

批量创建用户(死循环)

#!/bin/bash
USERS="cl"
i=1
while [ $i -le 5 ]
do
	useradd ${USERS}$i
	echo "123456" |passwd --stdin ${USERS}$i
	let++
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 循环语句

until语句 :提供循环执行,它与while循环相反, until循环将反复执行直到条件为真就结束循环,而while循环条件为假就结束循环。
使用格式:

until [ 测试条件 ]
do
语句 #可以是多条语句
done

在这里插入图片描述
例:
计算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
注:测试时切换下用户

四、循环控制语句

continue命令用于中止本次循环,重新判断循环条件,开始下一次循环。
break命令用于跳出循环,使用break可以跳出任何类型的循环:for、while、until。

例子:

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

在这里插入图片描述
3未输出,因为continue跳出了本次循环,开始下一次循环

break例子

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

在这里插入图片描述
只输出到7,因为break直接跳出了循环,不执行后面的。

总结

编写脚本的思路
1、明确脚本的功能实现功能
2、编写脚本时会使用到哪些命令?

3、把变化的数据使用变量表示
固定长的定义变量、经常调用参数可设变量
变化的定义变量
4、选择适合的流程控制语句,循环、双分支、多分支、case等

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐