Shell循环语句介绍(for、while、until)

本文详细介绍了Linuxshell中的基本循环结构,包括for、while和until循环的语法、用法示例以及它们在实际场景中的应用,如用户管理、网络检测、文件操作和数学游戏等。
摘要由CSDN通过智能技术生成

目录

一、相关介绍

1. echo

2. date

3. seq

4. 循环含义 

二、for循环 

1. 列表循环

2. 不带列表循环

3. 类C语言风格for循环

4. for循环应用示例

三、while循环

1. 基本介绍

2. 死循环

3. 双重循环及跳出循环

4. while循环应用示例

四、until循环

1. 基本介绍

2. 示例


一、相关介绍

1. echo

echo用于标准输出以及显示文本内容,单独使用默认进行空行,需要加选项-a取消换行。当使用-e选项时,表示使用转义符。常用转义符如下:

选项作用
\r光标移至行首,并且不换行
\s当前shell的名称,如bash
\t插入Tab键,制表符
\n输出换行
\f换行,但光标仍停留在原处
\表示插入"\"本身转义
\b表示退格 不显示前一个字符
\c抑制更多的输出或不换行

 示例:

[root@localhost ~]# echo -e "123\b456"
12456
#退格删除前面的字符,注意退格次数不能大于前面字符数
[root@localhost ~]# echo -e "\c"
[root@localhost ~]# 
#默认echo会换行,这里不换行

注意:

echo只能做一次运算,无法进行多次运算,需要用eval命令协助运算。

[root@localhost ~]# a=3;echo {1..$a}
{1..3}
[root@localhost ~]# a=3;eval echo {1..$a}
1 2 3

2. date

date查看当前系统时间

  • -d:你描述的日期,显示指定字符串所描述的时间,而非当前时间
  • %F:完整日期格式,等价于 %Y-%m-%d
  • %T:时间(24小时制)(hh:mm:ss)
[root@localhost ~]# date +%F-%T
2024-01-25-15:21:54
[root@localhost ~]# cal          #查看日历
      一月 2024     
日 一 二 三 四 五 六
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

3. seq

用于打印整数序列

[root@localhost ~]# echo {1..10..2}   #从1开始,步长为2,到10为止(奇数)
1 3 5 7 9
[root@localhost ~]# seq 1 2 10
1
3
5
7
9

4. 循环含义 

将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件。

重复运行次数:

  • 循环次数事先已知,使用for
  • 循环次数事先未知,使用while和until

二、for循环 

for循环是Linux中常用的循环结构,用于遍历列表、文件中的行或进行数值迭代。需要注意的是,for循环是按顺序遍历列表中的元素,对于数组,可以使用[@]来表示所有元素,也可以使用[*]表示所有元素。在处理包含空格等特殊字符的元素时,最好使用双引号将变量括起来。

语法结构:

  • 列表循环
  • 不带列表循环
  • 类C风格的for循环

1. 列表循环

语法:

for    变量名  in {取值列表}
do
       command          #循环体,执行操作
done

一般用法:

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的奇数,中间为步长

2. 不带列表循环

 语法:

for 变量名 
do
    command
done

示例:

#!/bin/bash
for i    
do
        echo hello
done
[root@localhost ~]# bash 1.sh 123      #把123赋值给变量i,i有值了它就开始执行do..done了
hello

3. 类C语言风格for循环

 语法:

for ((expr1;expr2;expr3))
do
       command
done

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

示例:

#!/bin/bash
for(( i=0;i<=5;i++))  #定义for循环i变量初始值为0,循环条件i小于等于5,每循环一次i自加1
do
echo "$i"             #for循环每循环一次执行一次输出$i
done                  #for语句结束标志
[root@localhost data]# bash 1.sh
0
1
2
3
4
5

4. for循环应用示例

示例1:通过用户列表文件创建用户

[root@localhost data]# cat user.txt 
zhangs
lis
wangw
[root@localhost data]# vim 1.txt
#!/bin/bash
for i in `cat /data/user.txt`
do
id $i &> /dev/null
if [ $? -eq 0 ];then
echo "${i}用户已存在"
else
useradd ${i}
echo 123 | passwd --stdin $i &> /dev/null
echo "${i}用户已创建"
fi
done
[root@localhost data]# bash 1.sh 
zhangs用户已创建
lis用户已创建
wangw用户已创建

示例2:ping网段检查主机连通性

[root@localhost ~]# vim ping.sh
 
#!/bin/bash
#name=ping
 
for i in {1..254}
do
{
ping -c1 -w2 192.168.190.${i} &> /dev/null && echo "192.168.190."$i" up" >> /data/up || echo "192.168.190."$i" down" >> /data/down
} &
done
#for循环,变量i取值1到254.向192.168.1.1~254各ping一个包,超时两秒,不论命令是否正确输出到垃圾箱;如果ping通将内容追加/data/up文件中;如果ping不通将内容追加/data/down文件中;整个过程后台运行。

示例3:批量修改文件后缀名 

[root@localhost data]# touch {1..5}.doc
[root@localhost data]# ls
1.doc  2.doc  3.doc  4.doc  5.doc
[root@localhost ~]# vim 1.sh
#!/bin/bash
for i in `ls /data`
do
a=`echo $i | cut -d"." -f1`
mv /data/$i /data/$a.txt
done
[root@localhost data]# ls
1.txt  2.txt  3.txt  4.txt  5.txt

 示例4:制作乘法口诀表

#!/bin/bash
# x行数 y列数
for x in {1..9}
        do
        for y in `seq $x`
        do
        echo -e "${y}x${x}=$[x*y] \t\c"
        done
        echo
done

[root@localhost data]# bash cf.sh 
1x1=1 	
1x2=2 	2x2=4 	
1x3=3 	2x3=6 	3x3=9 	
1x4=4 	2x4=8 	3x4=12 	4x4=16 	
1x5=5 	2x5=10 	3x5=15 	4x5=20 	5x5=25 	
1x6=6 	2x6=12 	3x6=18 	4x6=24 	5x6=30 	6x6=36 	
1x7=7 	2x7=14 	3x7=21 	4x7=28 	5x7=35 	6x7=42 	7x7=49 	
1x8=8 	2x8=16 	3x8=24 	4x8=32 	5x8=40 	6x8=48 	7x8=56 	8x8=64 	
1x9=9 	2x9=18 	3x9=27 	4x9=36 	5x9=45 	6x9=54 	7x9=63 	8x9=72 	9x9=81 

三、while循环

1. 基本介绍

while循环用于在满足某个条件的情况下,重复执行一系列命令或操作。while循环会在每次循环开始之前检查条件是否为真,只要条件为真,循环就会继续执行,直到条件为假。

语法:

while [条件]
do
    # 要执行的命令
done

#[条件]:这是确定循环是否应继续的条件。它可以是任何有效的 shell 表达式或返回真或假值的命令。只要该条件计算结果为真,循环就会继续执行
#do:标记循环块的开始位置,在此处定义要执行的命令
#要执行的命令:这些是将重复执行的命令,只要条件为真
#done:标记循环块的结束位置

示例:使用while循环打印从1到5的数字

num=1
while [ $num -le 5 ]     #检查变量num的值是否小于或等于5
do
    echo $num
    num=$((num + 1))     #打印当前的num值,并将num递增1
done

2. 死循环

① while [ 1 -eq 1 ] 判断条件一直为真,一直执行do内命令

② while true  直接写true

③ while :  判断条件为冒号也表示死循环

3. 双重循环及跳出循环

break跳出单个循环 break n数字,数字代表跳出n层循环

continue终止某次循环中的命令,但是不会完全终止命令

exit 直接退出脚本

示例1:结束某次循环

#!/bin/bash
for j in {1..2}
do
        for i in {1..5}
        do
        if  [ $i -eq 3 ];then
        continue                       #continue终止某次循环中的命令,但是不会完全终止命令
        fi
        echo i=$i
        done
echo "--------------------------------------"
done

[root@localhost data]# bash 1.sh
i=1
i=2
i=4
i=5
--------------------------------------
i=1
i=2
i=4
i=5
--------------------------------------

 示例2:结束多层循环

#!/bin/bash
for j in {1..2}
do
        for i in {1..5}
        do
        if  [ $i -eq 3 ];then
        break                       #break默认为1,结束一层循环
        fi
        echo i=$i
        done
echo "--------------------------------------"
done

[root@localhost data]# bash 1.sh
i=1
i=2
--------------------------------------
i=1
i=2
--------------------------------------

[root@localhost data]# bash 1.sh    #break 2,代表跳出两层循环
i=1
i=2

4. while循环应用示例

示例1:批量添加用户,用户名称以stu开头,按数字顺序编号,一共添加20个用户,初始密码均为123456

#!/bin/bash
u=1
while [ $u -le 20 ]
do
useradd stu$u
echo 123456 | passwd --stdin stu$u &> /dev/null
let u++
done
[root@localhost data]# bash u.sh
[root@localhost data]# tail /etc/passwd
stu11:x:1018:1018::/home/stu11:/bin/bash
stu12:x:1019:1019::/home/stu12:/bin/bash
stu13:x:1020:1020::/home/stu13:/bin/bash
stu14:x:1021:1021::/home/stu14:/bin/bash
stu15:x:1022:1022::/home/stu15:/bin/bash
stu16:x:1023:1023::/home/stu16:/bin/bash
stu17:x:1024:1024::/home/stu17:/bin/bash
stu18:x:1025:1025::/home/stu18:/bin/bash
stu19:x:1026:1026::/home/stu19:/bin/bash
stu20:x:1027:1027::/home/stu20:/bin/bash

示例2:猜商品价格

#!/bin/bash
n=`echo $[RANDOM%1000+1]`
time=0

while true
do
read -p "请输入商品的价格(1-1000):" m
let time++
if [ $n -eq $m ];then
echo "猜中了,商品价格是${m};猜了${time}次"
exit
elif [ $n -gt $m -a $m -le 1000 -a $m -gt 0 ];then
echo "价格过低"
elif [ $n -lt $m ] && [ $m -le 1000 ];then
echo "价格过高"
else
echo "输入有误,重新输入"
fi
done

[root@localhost data]# bash c.sh 
请输入商品的价格(1-1000):0
输入有误,重新输入
请输入商品的价格(1-1000):500
价格过高
请输入商品的价格(1-1000):250
价格过高
请输入商品的价格(1-1000):100
价格过低
请输入商品的价格(1-1000):150
价格过高
请输入商品的价格(1-1000):125
价格过高
请输入商品的价格(1-1000):115 
猜中了,商品价格是115;猜了7次

四、until循环

1. 基本介绍

until循环是一种用于执行命令直到指定条件为真时停止的循环结构,只要条件为假,dodone之间的代码块就会一直执行,until 循环通常用于需要在条件变为真之前重复执行一段代码的情况。

语法:

until 条件测试
do
循环体         #在条件为假时执行的命令
done

2. 示例

计算1-100的和

#!/bin/bash
sum=0
i=1
until [ $i -gt 100 ]          #当小于100时执行循环
do
let sum=$i+$sum
let i++
done
echo sum=$sum

[root@localhost data]# bash 1.sh
sum=5050
  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值