RHCE---流程控制之循环

文章目录

  • 目录

    文章目录

    前言

    一.for循环

    带列表的循环

     不带列表的循环

    基于C语言风格的循环

    二.while循环

    三.until循环

     四.循环控制

    五.循环嵌套 

    总结


前言

前文介绍了条件判断,本文章将介绍流程控制之循环。


一.for循环

带列表的循环

作用:在shell脚本中,for循环主要用于对一组数据或文件进行遍历处理。

结构:

for variable in list
do
    command1
    command2
    ...
done

 其中,variable是用来保存每个元素的变量名,list是需要遍历的元素列表,可以是一组数字、字符串,或者是一个文件中的行等等。在循环体中,可以执行需要重复执行的命令,如输出、计算等操作。

案例:

#!/bin/bash
for ip in 192.168.186.100 192.168.186.102 192.168.186.103
#写法2:for ip in 192.168.186.{100..103..1}:{开始值..终止值..步长} {}:产生集合的值
do                                
	echo $ip
done
[root@timeserver ~]# bash test1.sh
192.168.186.100 
192.168.186.102 
192.168.186.103

案列 2: 获取指定目录下的所有目录的文件名

[root@server ~]# vim for3.sh
#!/bin/bash
for FILE  in  $(ls -F / | grep /$) #-F将显示内容进行类别归类 
do                                 #^代表行首 $代表行尾 grep /$:过滤以/为结尾
        echo  $FILE
done

#检索从键盘输入的目录
read -p "请输入检索的目录" dir
for file in $(ls -F $dir | grep /$ )
do
	echo $file
done

 案列 3:计算1+2+3+4+5+……+100和

[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in {1..100..1}
do
       ((sum=sum+i))
done
echo "sum=$sum"

 不带列表的循环

原则:for不提供循环列表,shell将使用位置参数从命令行获取循环列 表数据及条件

格式:

for variable
do
 statement1
 statement2
 ...
done

基于C语言风格的循环

格式:

for ((初始化;条件表达式;步长))    # 注意:2个园括号
do
 statement1
 statement2
 ...
done

案列:面试题:批量创建账户并给账户设置密码

[root@server ~]# vim for6.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
        if ! id -u test$i &> /dev/null
        then
               useradd test$i
                echo  "123456" | passwd -- stdin test$i &> /dev/null
        else
                echo  "test$i 已存在!"
        fi
done
#id -u:测试账户是否存在
#test$i:当i=1时,$提取i的值为1,此时test$i为test1
#i:取反
#passwd -- stdin:按标准输入设置密码

注意:i++置后自增:先使用 i 的值参与后续运算,最后增加1

           ++i置前自增 :先增自增1,在参与后续运算

[root@server ~]# x=1
[root@server ~]# y=2
[root@server ~]# echo $((x++))
1
[root@server ~]# echo $x
2
[root@server ~]# echo $((++y))
3
[root@server ~]# echo $y
3

二.while循环

格式:

while expression
do
 statement1
 statement1
 ……
done
  • 上例语法中,expression表示条件表达式,循环必须满足 该表达式,否则循环结束,可以是任何符合语法的shell命 令,但推荐书写测试表达式

案例:

猜商品价格,通过变量RANDOM获取随机整数并控 制20以内,提示用户猜测商品价格,猜测时需要记录次 数,猜中后退出程序

[root@server ~]# vim while2.sh
#!/bin/bash
PRICE=$((RANDOM%20)) 
count=0                #定义变量存储次数
while true             # 无循环条件恒真执行
do
       read  -p "请输入[1-20]间的商品价格: " INT
       let ((count++))
       if (($INT==$PRICE))
       then
               echo "恭喜,你猜对了!"
               echo  "你使用了$count次机会."
               exit 0  #用于跳出恒真执行防止死循环                 
# 跳出while循环
        elif   (($INT>$PRICE))
        then
                echo  "你输入的商品价格高了."
        else
                echo  "你输入的商品价格低了."
        fi
done
# RANDOM是一个环境变量,产生[1,32767]的整数,对20取余是控制随机数在1-19间

三.until循环

  • until循环不断地重复执行循环中的语句,直至某个条件成 立,与while循环的执行条件相反

 格式:

until expreession
do
 statement1
 statement2
 ……
done

案列:批量删除账户

​
#!/bin/bash
i=1
until [  $i -gt 10 ]  # i>10 ,注意,条件要相反
do

        if id -u test$i &> /dev/null
        then
               userdel  -r test$i
else
                echo "test$i 账户已删除"
        fi
       let i++
done

 四.循环控制

  • break: 是立即跳出某个循环结构。break语句可以用在for、while或者until等循环语句的循环体中
  • continue: 作用不是退出循环体。而是跳过当前循环体中 该语句后面的语句,重新从循环语句开始的位置执行 RHCE---流程控制之循环_第1张图片

RHCE---流程控制之循环_第2张图片 

RHCE---流程控制之循环_第3张图片 

 RHCE---流程控制之循环_第4张图片

 案列:判断素数

[root@server ~]# vim for7.sh
#!/bin/bash
read  -p  "请输入一个正整数: " prime
if ((prime<2))
then
        echo  "数据错误,请输入大于等于2的正整数."
else
        for ((i=2;i

案列2:计算100到150之间不能被3整除的数,输出时一行 显示5个

#!/bin/bash
count=0
for ((i=100;i<=150;i++))
do
        if ((i%3==0))
        then
               continue
        fi
        echo -ne "$i\t"
       ((count++))
        if ((count%5==0))
        then
                echo
        fi
done
echo

五.循环嵌套 

案例:打印99乘法表

#!/bin/bash
for i in `seq 9`
do
        for j in `seq 9`
        do
               ((j<=i)) && echo -ne 

"$i*$j=`echo $((i*j))`\t"
        done
        echo
done

案列2:打印三角形

#!/bin/bash
for ((i=1;i<10;i++))   # 打印9行
do
        for ((j=1;j<10-i;j++))  # 每一行打印一
些空格
        do
                echo  -n  " "  
        done
        for ((k=1;k<=i;k++))   # 每一行打印一
些数字
        do
                echo  -n  "$i "
        done
        echo                  # 打印一个\n
done

 


总结

你可能感兴趣的:(RHCE,linux,运维)