Shell脚本三种循环语句
一、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等
更多推荐

所有评论(0)