Shell脚本之循环语句——for循环、while循环、until循环

一.for循环

1.1 用法

  • 读取不同的变量值,用来逐个执行同一组命令
  • for循环经常使用在已知要进行多少次循环的场景

1.2 格式

格式一:

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

格式二(类C语言格式):

for ((表示式1;表示式2;表示式3))
do
    命令序列
done
##表达式1:定义变量并赋值

##表达式2:决定是否循环

##表达式3:决定循环变量如何改变,决定循环什么时候结束

 二、while循环

2.1 用法

  • 用于不知道循环次数,需要主动结束循环或达到条件结束循环。

2.2 格式

while   [ 判断条件]
do
  执行动作 
done   
举例:
vim  b.sh               #创建脚本b.sh
脚本内容:
#!/bin/bash
i=0
while [ $i -le 5  ]     #变量i小于等于5时执行while循环
do
echo "$i"               #循环执行内容,每循环一次打印$i
let i++                 #每循环一次计算一次i++即i自己+1
done                    #while语句结束标志 
bash  b.sh              #调用bash执行b.sh脚本
执行结果:
0
1
2
3
4
5

2.2 死循环

格式一
while  [1  -eq  1]   判断条件写一个永久为真的条件 

    do       一直执行do内的命令

    done
格式二
while  true        直接写判断条件为真

    do       一直执行do内的命令

    done
格式三
while :         判断条件为冒号也表示死循环

    do       一直执行do内的命令

    done

2.3 跳出循环

2.3.1 continue

表示满足continue条件时跳出循环,但是不影响后续循环执行

举例:
vim a.sh         #创建脚本a.sh
脚本内容:
#!/bin/bash
for i in {1..5}  #for循环5次从i=1开始到i=5    
do
if [ $i -eq 3 ]  #if判断语句,若$1等于3则执行then的内容
then 
continue         #当$i=3时跳出循环但不影响后面循环  
fi               #结束if语句
echo "$i"        #没执行一次for循环输出一次$i
done             #for循环结束语句
bash a.sh        #调用shell执行脚本
输出结果
1
2
4
5
 

2.3.2 break

在某个循环中遇到break直接结束此次循环,但是不影响外边嵌套的循环。

break  [数字] :结束数字中的几次循环,若为2则结束自己所在循环和外边嵌套的一层循环,若为3则结束自己所在循环和外边嵌套的2层循环

举例:
vim   a.sh     #创建a.sh脚本
脚本内容:
#!/bin/bash
for j in {1..3}      #第一层for循环,j=1,2,3各执行一次do的内容
do                   #第一层for循环的执行内容
    for i in {1..5}  #第二层for循环,i=1,2,3,4,5各执行一次do的内容
    do               #第二层for循环的执行内容  
        if [ $i -eq 3 ]  #第二层for循环中添加的if判断语句,当$i=3是执行then内容
        then                
        break            #第二层for循环判断语句执行命令,break结束循环
        fi               #if语句结束
    echo "$i"            #第二层for循环语句执行每循环一次输出$i
    done                 #第二层for循环语句结束标志                
done                     #第一层for循环语句结束标志
bash a.sh                #调用bash执行a.sh脚本
执行结果:第二层执行在$i=3是结束了循环,所以只能输出1和2,第一层for循环是循环3次,所以输出了3次。
1
2
1
2
1
2

三、until语句

3.1 until语句结构

until 条件测试操作
do
	命令序列
done
举例:
vim   a.sh     #创建a.sh脚本
脚本内容:
#!/bin/bash
i=1				##定义变量i=1
sum=0			
until [ $i -eq 51 ]		##$i等于51时停止执行
do	
        sum=$[$i+$sum]	##定义sum等于$i + $sum
        let i++			##每次循环i+1	

done
echo "$sum				##打印结果 $sum
bash zz.sh 
1275

四、常用循环脚本实例

4.1 循环打印9*9乘法表

思路:

  1. 第一步for循环打印一行9个*号
  2. 第二步再添加一个for循环打印一个9行9列的*号正方形
  3. 第三步将*号正方形斜砍一般形成9*9乘法表的基本格式
  4. 第四步将*号9*9乘法表格式用乘法算式替
9*9乘法表
第一步:
vim 99.sh              #创建99.sh脚本
脚本内容:
#!/bin/bash
for i in {1..9}        #for循环9次从i=1开始
do
echo -n "*"            #每循环一次打印一个*,echo  -n参数表示不换行
done                   #此for循环语句结束
bash  99.sh            #调用shell执行脚本
执行结果:
*********
第二步:
vim 99.sh              #编辑99.sh脚本
脚本内容:
#!/bin/bash
for  j  in  {1..9}     #添加打印列循环,循环9次从j=1开始  
do                     #j循环时做do中的内容    
    for i in {1..9}    #第一步for循环内容不变
    do
    echo -n "*"
    done
echo                   #列循环每循环一次打印一行空格进行换行
done                   #列循环for语句结束标志
bash  99.sh            #调用shell执行脚本
执行结果:
*********
*********
*********
*********
*********
*********
*********
*********
*********
第三步:
vim 99.sh              #编辑99.sh脚本
脚本内容:
#!/bin/bash
for  j  in  {1..9}     #列循环内容不变  
do                         
    for i in `seq $j`  #修改行循环i的取值范围为展开变量j,即当j=1时i取值只有1,所以循环一次。当 
                       j=2时,i取值为1和2,所以i=1和i=2各循环一次,循环2次。以此类推到j=9
    do
    echo -n "*"
    done
echo                   
done                   
bash  99.sh            #调用shell执行脚本
执行结果:
*
**
***
****
*****
******
*******
********
*********
第四步:
vim 99.sh              #编辑99.sh脚本
脚本内容:
#!/bin/bash
for  j  in  {1..9}     #列循环内容不变  
do
    for i in `seq $j`
    do
    echo -ne "$j*$i=$[ $j*$i ]\t"   #行输出内容修改为9*9算式和结果。$[ ]表示计算里面的正整数结 
                              果,echo -e参数表示调用转义符,\t表示制表符即循环时输出一个tab键
    done
echo                   
done                   
bash  99.sh            #调用shell执行脚本
输出结果:
1*1=1	
2*1=2	2*2=4	
3*1=3	3*2=6	3*3=9	
4*1=4	4*2=8	4*3=12	4*4=16	
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	
6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	
7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	
8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	
9*1=9	9*2=18	9*3=27	9*4=36	9*5=45	9*6=54	9*7=63	9*8=72	9*9=81

4.2 循环ping测试某个网段网络连通性

需求:测试用户输入的某个32位网段是否可以ping通,且若可以ping通将此ip输出到文件host.txt中。

思路:

  1. 第一步读取用户输入的32位网段。
  2. 使用for循环生成用户输入网段的所有ip。
  3. 使用ping命令在循环中测试用户输入网段内所有ip,注意指定ping包个数和超时结束时间,否则一直ping。
  4. 将循环检查网络连通性放入后台执行
read -p "输入一个网段:" ip
for a in {1..254}   #for循环254次,从i=1开始
do
{                   #将{}内容当成一个整体
  ping -c 2 -W 2 $ip$a &> /dev/null  #指定ping包为2个超时结束时间为2秒且将产生的内容全部放入null垃圾桶中,&符号表示错误输出也放入null垃圾桶中
 if [ -$? -eq 0 ]  #if条件判断如果上一个循环执行的命令是正确的则$?返回0,若等于0执行then的内容
  then

    echo $ip$a >> /opt/ip.txt  #将if条件成立的ip追加到ip.txt文件中
    continue  #跳出本次循环
 else
    echo "!"  #if添加判断不成立执行打印
 fi
}&            #将循环成立的内容放入后台执行
#并行执行!
done
wait
#执行结束,不等待,直接退出!

 4.3 while死循环实现猜数字游戏

需求:生成随机1-100的价格给用户猜测直到猜对结束游戏,并统计用户猜对猜了几次。

思路:

  1. 第一步生成一个随机1-100数字
  2. 第二步使用while循环写一个死循环直到用户猜对才结束循环
  3. 在执行循环的过程中统计循环执行次数并输出

num=$((RANDOM%10+1))    #$[RANDOM]是一个0-32767的随机数,%100+1除100取余+1表示生成0-100随机数
i=1                
while true              #循环初始次数为1
do
read -p "请输入:" a
   if [ $a -lt $num ]  #条件判断分支1,如果用户输入小于随机生成执行本次then动作

   then
     echo "猜的数小了!"
   elif [ $a -eq $num ]  #条件判断分支2,如果用户输入等于随机生成执行then动作
   then
     echo "恭喜猜对了!"
     echo "猜了${i} 次"
   break                #猜对了,结束循环并跳出
   else
     echo "猜的数大了!"  #其他情况,猜小了
   fi
let i++                  #循环每次累加1
done

4.4 数字累加脚本(1-100)

for循环:

sum=0         #定义变量sum初始值为0
for i in {1..100} #for循环 i取值从1到100
do
sum=$[ i+sum ]    #每次循环内容计算变量i+sum的值赋值给sum
done              #for语句结束标志
echo "1-100累加值为:$sum"  #循环结束后输出内容
bash  sum.sh      #调用shell执行脚本
执行结果:
"1-100累加值为:5050"

while循环:

vim sum1.sh   #创建sum1.sh脚本
脚本内容
#!/bin/bash
sum=0         #定义sum变量初始值
i=0           #定义i变量初始值
while [ $i -le 100 ]  #while循环,条件为当$1小于等于100时执行
do
sum=$[ i+sum ]        #循环执行内容计算i+sum的值重新赋值给i
let i++               #每执行一次循环计算一次变量i自加1
done                  #while语句结束标志
echo  "1-100的累加值为:$sum"  #循环完成后输出
bash sum1.sh          #调用bash执行脚本
执行结果:
1-100的累加值为:5050

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值