Linux之shell循环

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

相关推荐

  1. LinuxShell脚本

    2024-03-17 18:16:04       22 阅读
  2. linux shell 使用mv 循环替换文件名

    2024-03-17 18:16:04       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-17 18:16:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-17 18:16:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-17 18:16:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-17 18:16:04       18 阅读

热门阅读

  1. MongoDB聚合运算符:$expMovingAvg

    2024-03-17 18:16:04       14 阅读
  2. 【每日前端面经】2024-03-14

    2024-03-17 18:16:04       18 阅读
  3. Git中的换行符CRLF和LF问题

    2024-03-17 18:16:04       21 阅读
  4. C++使用for(:)遇到的BUG

    2024-03-17 18:16:04       18 阅读
  5. C++知识点总结(25):表达式求值

    2024-03-17 18:16:04       17 阅读