shell循环语句

循环语句

1.for循环

for循环语句

一、for循环
1、语法结构
(1)列表循环
(2)不带列表循环
(3)类C风格的for循环

遍历

for 变量名 in {list}
do
    command
done
for i in {a..c}
do
    echo $i
done
for i in {1..5}    //{}里面不识别变量
do
        echo $i
done
for i in `seq 5`   //seq 5=1、2、3、4、5序列
do      
        echo $i
done
a=10
for i in `seq $a`    //seq可以引用变量
do
        echo $i
done
for 变量名 in a b c
do
    command
done
for i in a b c   //i这里实际没有调用,所以就相当于in后面几个参数就循环几次
do
        echo 123
done
for i in a b c    //这里调用到i变量了,所以就正常显示i的值(a\b\c)
do
        echo $i
done

案列
例1:打印1-5这5个数字

[root@server ~]# vim for.sh

#!/bin/bash

for i in {1…5}
do
echo $i
done

例2:打印5次hello world
注意:虽然我们定义了一个变量i,但是没有使用它,它只是控制循环次数

[root@server ~]# vim for.sh

#!/bin/bash

for i in {1…5}
do
echo hello world
done

例3:打印abcde

[root@server ~]# vim for.sh

#!/bin/bash

for i in a b c d e
do
echo $i
done

例4:输出0-50之间的偶数

[root@server ~]# vim for1.sh

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

附1小技巧:花括号{}和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的奇数,中间为步长

for i in $(seq 0 2 10) 1-10的偶数,中间为步长
例子
for i in $(seq 0 2 10);do echo $i ;done

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

for 变量名
do
command
done

例1:打印hello
第一种:
[root@server ~]# vim for2.sh

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

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

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

第二种:
for i
do
echo $i
done
[root@client ~]# bash for.sh hello
hello

(3)类C风格的for循环
for ((expr1;expr2;expr3))
do
command
done

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

例1:打印1-5
迭代
[root@server ~]# vim for3.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
echo $i
done
1
2
3
4
5

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

例2:打印1-10的奇数

[root@server ~]# vim for3.sh
#!/bin/bash
for ((i=1;i<=10;i+=2)) //i=i+2
do
echo $i
done

附2:类C风格运算符用法
++ 自身变量+1
– 自身变量-1
+=5 自身变量+5
-=5 自身变量-5
=5 自身变量5
/=5 自身变量/5
%=5 自身变量%5

例3:计算1-100的奇数和

[root@server ~]# vim for3.sh

#!/bin/bash
sum=0
for ((i=1;i<=100;i+=2))
do
let sum= i + i+ i+sum
done
echo “1-100的奇数和为:$sum”

案例:
例1、批量添加用户两种方式

1)以后缀批量变化添加
for i in {1…5}
do
useradd stu i e c h o " 123 " ∣ p a s s w d − − s t d i n s t u i echo "123" | passwd --stdin stu iecho"123"passwdstdinstui
done

2)脚本批量添加用户=====
#!/bin/bash
ULIST=$(cat /root/users.txt)

for UNAME in $ULIST
do
useradd $UNAME
echo “123456” | passwd --stdin $UNAME &>/dev/null
done

//批量删除用户的脚本=====

vim udelfor.sh

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

done

例2、根据 IP 地址列表检查主机状态========
-c 发送包的数量;-i 发送 ping 包间隔;-W 超时时间
1)根据文本查看

#!/bin/bash
HLIST=$(cat /root/ipadds.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

2)根据段查看
network=“192.168.10”
for addr in {1…254}
do
ping -c 2 -i 0.5 -W 3 n e t w o r k . network. network.addr &> /dev/null
if [ ? − e q 0 ] ; t h e n e c h o " ? -eq 0 ];then echo " ?eq0];thenecho"network. a d d r i s u p " e l s e e c h o " addr is up" else echo " addrisup"elseecho"network.$addr is down"
fi
done

#用户输入密码,脚本判断密码是否正确,输入正确提示正确信息,连续输错3次则报警
vimtest. sh
#!/bin/bash
init=123456
for i in {1. .3}
do
read -p "请输入密码: "pass
if [ $pass == $init ] ; then
echo “密码正确”
exit
fi
done
echo “警官:密码错误”

#幸运会员
#!/bin/bash
a=0
b=0
c=0
for ((i=1;i<=10;i++))
do
num=$(expr [ R A N D O M L I S T = [RANDOM%3+1]) LIST= [RANDOMLIST=(cat /opt/name.txt|grep “$num”|awk -F: ‘{print $2}’)
case L I S T i n z h a n g s a n ) l e t a + + ; ; l i s i ) l e t b + + ; ; ∗ ) l e t c + + e s a c e c h o " LIST in zhangsan) let a++ ;; lisi) let b++ ;; *) let c++ esac echo " LISTinzhangsan)leta++;;lisi)letb++;;)letc++esacecho"LIST"

done
echo “zhangsan: a 次 、 l i s i : a次、lisi: alisi:b次、wangwu:$c次”

2.while语句的结构

while循环
1、语法结构
2、死循环
(1)语法结构(3种)

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

1、语法结构
while 表达式
do
command
done

例1:打印1-5

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

i= [ [ [i+1] //两种写法

done
echo “最后i的值为: $i”

例2:输出1-100之间不能被3整除的数字

[root@server myscripts]# vim 33.sh

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

例3:打印1-100的和
#!/bin/bash
i=1
sum=0
while [ i − l e 100 ] d o l e t s u m = i -le 100 ] do let sum= ile100]doletsum=i+$sum
let i++
done
echo $sum

例4:监控某服务(httpd)运行状态

while ps aux | grep httpd | grep -v grep &> /dev/null
do
echo “httpd 正在运行中”
sleep 2
done
echo “httpd 不在运行”

while死循环
while [ 1 -eq 1 ] //写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去
do
command
done

while true
do
command
done

while :
do
command
done

例1:猜数字,猜不对就一直猜=========
num=10
while true
do
read -p “请输入数字:” shu
if [ $shu -eq $num ];then
echo “你猜对了”
break
elif [ $shu -gt $num ];then
echo “你猜大了”
elif [ $shu -lt $num ];then
echo “你猜小了”
fi
done

例2
1.批量添加规律编号的用户========
#!/bin/bash
USERS=“stu”
i=1
while [ $i -le 20 ]
do
useradd U S E R S {USERS} USERSi
echo “123456” | passwd --stdin U S E R S {USERS} USERSi &> /dev/null
let i++
done

例3
猜商品价格游戏
$random用于生成0—32767的随机数

第一种方法

#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
a=0
echo “商品实际价格范围为 0-999,猜猜看是多少?”
while true
do
read -p “请输入你猜测的价格数目:” n
let a++
if [ $n -eq $PRICE ] ; then
echo “恭喜你答对了,实际价格是 $PRICE”
echo “你总共猜测了 $a 次”
exit 0
elif [ $n -gt $PRICE ] ; then
echo “你猜高了!”
else
echo “你猜低了!”
fi
done

第二种方法
#!/bin/bash
sorce= [ [ [RANDOM % 1000]
a=1
num=0
while[ $a -lt 2 ]
do
read -p “请输入你猜的价格(1-999之 间) :” price
if [ $price -eq $sorce ] ; then
echo “恭喜你猜对了!”
let num++
let a++
elif [ $price -gt $sorce ] ; then
echo “你猜高了!”
let num++
elif[ $price -lt s o r c e ] ; t h e n e c h o " 你 猜 小 了 ! " l e t n u m + + f i d o n e e c h o " 你 一 共 猜 了 sorce ] ; then echo "你猜小了!" let num++ fi done echo "你一共猜了 sorce];thenecho"!"letnum++fidoneecho"num次!"

例4 实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M 时,发送报警邮件给 root 管理员
#!/bin/bash
#提取根分区剩余空间
disk_size=$(df / |awk '///{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 4}̲') #提取内存剩余空间 me…(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

例5 定义网卡流量
#!/bin/bash

#定义流量单位
DW=kb/s

while :
do
#定义某一时间点的提取网卡流量数值,我这里的网卡是ens33
OLD_IN=$(cat /proc/net/dev | awk ‘$1~/ens33/{print $2}’)
OLD_OUT=cat /proc/net/dev | awk '$1~/ens33/{print $10}'
sleep 5

#定义下一个时间点的提取网卡流量数值。
NEW_IN=$(cat /proc/net/dev | awk '$1~/ens33/{print $2}')
NEW_OUT=`cat /proc/net/dev | awk '$1~/ens33/{print $10}'`
 
#进行流量的计算,默认是Bytes,转换成kb/s
IN=$[$[$NEW_IN - $OLD_IN]/1024]$DW
OUT=$[$[$NEW_OUT - $OLD_OUT]/1024]$DW
sleep 5
 
#打印对应的值
echo -e "接收数据:${IN}\t发送数据:$OUT"

#!/bin/bash
i=1
sum=0
while [ i − l e 5 ] d o e c h o " 进 入 第 i -le 5 ] do echo "进入第 ile5]doecho"i家商店"
read -p “是否进入看看(yes/no)” doing
while [ $doing = “yes” ]
do
echo “1:衣服¥200”
echo “2:鞋子¥150”
echo “3:手套¥40”
echo “4:裤子¥155”
read -p “请选择需要购买的商品序列:” num
case $num in
1)
echo “衣服购买成功”
expr $[sum+=200] &> /dev/null
;;
2)
echo “鞋子购买成功”
expr $[sum+=150] &> /dev/null
;;
3)
echo “手套购买成功”
expr $[sum+=40] &> /dev/null
;;
*)
echo “裤子购买成功”
expr $[sum+=155] &> /dev/null
esac
read -p “是否继续进行购买(yes/no)” doing

done
let i++
if [ d o i n g = " n o " ] t h e n c o n t i n u e f i d o n e e c h o " 购 物 总 价 : doing = "no" ] then continue fi done echo "购物总价: doing="no"]thencontinuefidoneecho":sum"

3.until循环

跟while相反,条件为假进入循环,条件为真退出循环
语法结构
until 表达式
do
command
done

例1:计算1-50的和1275两种写法第一种======

#!/bin/bash
i=0;s=0
until [ $i -eq 51 ]
do
let s+=i #s+=i,等价于s=s+i,使用加赋值
let i++
done
echo $s

第二种
vim 50.sh
#!/bin/bash
i=1
sum=0
until [ $i -eq 51 ] //这里注意如果是50的话条件为真循环结束它计算的是1-49的和,until [ i − g t 50 ] 也 行 d o s u m = i -gt 50 ]也行 do sum= igt50]dosum=[ i + i+ i+sum]
let i++
done
echo “$sum”

死循环结构
until false
do
command
done

until [ 1 -ne 1 ]
do
command
done

案例2、登录zhangsan用户 使用root 发消息个zhangsan ================

#!/bin/bash
username=$1
#判断信息格式
if [ $# -lt 1 ];then
echo “Usage:basename $0 []”
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

注:测试时切换下用户

4、循环控制语句

for循环一般会搭配条件判断语句和流程控制语句一起执行,那么就会出现需要跳过循环和中止循环的情况,控制循环的命令有以下3个

1、continue
继续,但不会执行循环体内下面的代码了,开始重新开始下一次循环

例1:打印1-5的数字,3不打印

[root@server ~]# vim for4.sh

#!/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
打断,马上停止本次循环,执行循环体外的代码

例2:1-10的数字,7后面的都不打印

[root@server ~]# vim for4.sh

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

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

for i in {1…5}
do
if [ $i -eq 3 ];then
exit 100
else
echo $i
fi

done
echo hi
直接跳出程序所以不会执行最后的echo hi,并且返回码是100通过$?查看

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值