当前位置: 首页 > article >正文

Linux之shell循环

华子目录

  • for循环
    • 带列表的for循环
      • 格式
      • 分析
      • 示例
      • shell允许用户指定for语句的步长,格式如下
      • 示例
    • 不带列表的for循环
      • 示例
    • 基于C语言风格的for循环
      • 格式
      • 示例
      • 注意
  • while循环
    • 格式
    • 示例
  • until循环
    • 作用
    • 格式
    • 示例
  • 循环控制
    • break
    • continue
    • 详细语法
    • 示例
  • 循环嵌套
    • 示例

for循环

  • for循环是最简单,也是最常用的循环语句。与其他的程序设计语言一样,for循环都是初学者在学习循环结构时的入门课程。for循环通常用于遍历整个对象或者数字列表。按照循环条件的不同,for循环语句可以分为带列表的for循环、不带列表的for循环以及类C风格的for循环。本节将介绍这3种不同的for循环结构。

带列表的for循环

格式

for 循环变量 in {list} 
do
	statement1
	statement2
	...
done

分析

  • variable称为循环变量
  • list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开
  • do和done之间的所有的语句称为循环体,即循环结构中重复执行的语句
  • 执行时,Shell会将in关键字后面的list列表的第1个元素的值赋给变量variable,然后执行循环体,当循环体中的语句执行完毕之后剩余以此类推,当list列表中的所有的元素都被访问后,for循环结构终止,程序将继续执行done语句后面的其他的语句

示例

[root@server ~]# vim  for1.sh
#!/bin/bash
for ip in 192.168.80.129 192.168.80.130
do
        echo $ip
done



[root@server ~]# bash for1.sh 
192.168.80.129
192.168.80.130
[root@server ~]# vim  for2.sh
#!/bin/bash
for ip in 192.168.80.{120..140..1} # 使用{start..end..step} 进行扩展
do
        echo  $ip
done



[root@server ~]# bash for2.sh
192.168.80.120
192.168.80.121
192.168.80.122
192.168.80.123
192.168.80.124
192.168.80.125
192.168.80.126
192.168.80.127
192.168.80.128
192.168.80.129
192.168.80.130
192.168.80.131
192.168.80.132
192.168.80.133
192.168.80.134
192.168.80.135
192.168.80.136
192.168.80.137
192.168.80.138
192.168.80.139
192.168.80.140
  • 获取指定目录下的所有目录的文件名
[root@server ~]# vim for3.sh
#!/bin/bash
for file  in $(ls -F / | grep  "/$")
do
        echo  $file | cut  -d  "/" -f1
done

# ls -F  :用于将目录内的文件按照文件类型进行归类显示,会在不同类别的文件名尾部增加不同的标识符,目录以/结尾、链接文件以@结尾、可执行文件以*结尾、普通文件无符号
# grep "/$" :表示过滤以/结尾的行

[root@server ~]# bash for3.sh
afs
boot
dev
etc
home
media
mnt
opt
proc
root
run
srv
sys
tmp
usr
var

shell允许用户指定for语句的步长,格式如下

for variable in {start..end..step}
do
	statement1
	statement2
	...
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"



[root@server ~]# bash for4.sh
sum=5050
# 上例修改
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in $(seq 100)
do
        ((sum=$sum+$i))
done
echo "sum=$sum"




[root@server ~]# bash for4.sh
sum=5050

不带列表的for循环

  • 原则:for不提供循环列表,shell将从命令行(相当于以位置参数的形式传入循环列表)获取循环列表数据及条件,格式:
for variable
do
	statement1
	statement2
	...
done
  • 由于系统变量$@可以获取所有位置参数,以上的语法等价于:
for variable in $@$*
do
	statement1
	statement2
	...
done

示例

[root@server ~]# vim for5.sh
#!/bin/bash
for  arg
do      
        echo  $arg
done    


[root@server ~]# bash for5.sh {1..10..2}
1
3
5
7
9

基于C语言风格的for循环

格式

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

示例

  • 面试题,批量创建账户
[root@server ~]# vim for6.sh
#!/bin/bash
for((i=1;i<=10;i++))
do
        if ! id -u temp$i &> /dev/null
        then
                useradd temp$i
                echo "123456" | passwd --stdin temp$i &> /dev/null
        else
                echo "temp$i 账户已存在"
        fi
done                 





[root@server ~]# bash for6.sh
[root@server ~]# id temp1
用户id=1001(temp1) 组id=1001(temp1)=1001(temp1)

注意

i++表示置后自增,++i置前自增

[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命令,但推荐书写测试表达式

示例

  • while循环读取文件
# 法1 ,采用exec读取文件
[root@server ~]# vim  file1.txt
data1
data2
data3
data4
data5
[root@server ~]# vim  while1.sh
#!/bin/bash
exec  < file1.txt
while  read   a
do
        echo $a
done
# exec  < file1.txt  将file.txt文件内容读入到标准输入中
# read   a  表示从标准输入中按照行读取内容到变量a



[root@server ~]# bash while1.sh
data1
data2
data3
data4
data5
# 法2:使用cat读取文件,通过管道符进入while循环处理
cat  文件名  |  while  read line
do  
	statement1
	statement1
	……
done
#法3 : 在while循环尾部使用输入重定向指定输入数据
while  read  line
do
	statement1
	statement1
	……
done  <  文件名
  • 猜商品价格,通过变量RANDOM获取随机整数并控制20以内,提示用户猜测商品价格猜测时需要记录次数猜中后退出程序
[root@server ~]# vim  while2.sh
#!/bin/bash
price=$[ $RANDOM%20 ]
count=0
while true
do
        read -p "请输入[0-20]间的商品价格: "  INT
        let count++
        if(($INT==$price))
        then
                echo  "恭喜,你猜中!"
                echo  "你使用了$count次机会"
                exit  0
        elif (($INT>$price))
        then
                echo  "你输入的商品价格高了!"
        else
                echo  "你输入的商品价格低了!"
        fi
done




[root@server ~]# bash while2.sh
请输入[0-20]间的商品价格:10
你输入的商品价格高了
请输入[0-20]间的商品价格:5
你输入的商品价格高了
请输入[0-20]间的商品价格:3
你输入的商品价格高了
请输入[0-20]间的商品价格:2
你输入的商品价格高了
请输入[0-20]间的商品价格:1
你输入的商品价格高了
请输入[0-20]间的商品价格:0
恭喜,你猜中了
你使用了6次机会

until循环

作用

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

格式

until  expreession
do
	statement1
	statement2
	……
done

示例

[root@server ~]# vim  while3.sh
# while3.sh 的改写
#!/bin/bash
i=1
until [  $i -gt 10 ]  # i>10 ,注意,条件要相反
do
        if id -u temp$i &> /dev/null
        then
                userdel  -r test$i
        else
                echo "test$i 账户已删除"
        fi
        let i++
done

循环控制

break

break: 是立即跳出某个循环结构。break语句可以用在for、while或者until等循环语句的循环体中

continue

continue: 作用不是退出循环体。而是跳过当前循环体中该语句后面的语句,重新从循环语句开始的位置执行

详细语法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

示例

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



  • 计算100到150之间不能被3整除的数,输出时一行显示5个
[root@server ~]# bash  for8.sh
#!/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

循环嵌套

示例

  • 九九乘法表
[root@server ~]# bash  for9.sh
#!/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
  • 打印三角形
[root@server ~]# bash  for10.sh
#!/bin/bash
read  -p  "请输入图形行数:"  h   
for ((i=0;i<h;i++))         # 循环处理h行
do
        for ((j=0;j<h-i;j++))  # 每行打印一些空格
        do
                echo  -n " "
        done
        for ((k=0;k<2*i+1;k++))  # 每行打印一些星号
        do
                echo  -n  "*"
        done
        echo                     # 每行最后打印一个\n
done
  • 打印数字三角形
[root@server ~]# bash  for11.sh
#!/bin/bash
for ((i=1;i<10;i++))
do
        for ((j=1;j<=10-i;j++))
        do
                echo  -n  " "
        done
        for ((k=1;k<=i;k++))
        do
                echo  -n  "$i"
        done
        echo
done

http://www.kler.cn/a/271647.html

相关文章:

  • 留学生scratch计算机haskell函数ocaml编程ruby语言prolog作业VB
  • 【腾讯云】腾讯云docker搭建单机hadoop
  • 中国股市“慢牛”行情的实现路径与展望
  • Win11下帝国时代2无法启动解决方法
  • C语言连接Mysql
  • 展示统计信息收集情况
  • linux常用命令(二)
  • 【Git】error: bad signature 0xb86f1e1 和 bfatal: index file corrupt
  • 51单片机系列-单片机定时器
  • 水库大坝安全监测中需要注意的事项
  • 基于粒子群(PSO)的PID控制器matlab仿真
  • Android中使用intent可以传递哪些类型的数据?
  • 请求头content-type的类型有什么?
  • innovus中path group 的策略和应用(上)
  • python之自动化(django)
  • Python实现连连看
  • linuxOPS基础_linux命令合集
  • 解决:IDEA编译Java程序时报编译失败
  • 【Linux】信号量和线程池
  • 【深度学习】深度估计,Depth Anything Unleashing the Power of Large-Scale Unlabeled Data
  • C#控制台贪吃蛇
  • Redis数据存储的细节
  • upload-labs通关方式
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的自动驾驶目标检测系统详解(深度学习+Python代码+PySide6界面+训练数据集)
  • 1.python安装
  • Unity Timeline学习笔记(3) - SignalTrack信号轨道和自定义带参数的Marker信号和轨道