Shell脚本(三)_循环分支

13 篇文章 0 订阅

AUTHOR:闫小雨

TIME:2024-05-10


目录

一、for循环语句

1、for语句结构

使用场景

执行机制

列表生成方式

优缺点

优点

缺点

流程图

2、for循环语句应用示例

实例1:列出循环次数

实例2:创建文件夹

二、While循环语句

1、while语句结构

使用场景

执行机制

优缺点

优点

缺点

流程图:

2、while循环语句应用示例

实例1:倒计时

实例2:猜谜码

三、case分支语句

1、case语句结构

使用场景

执行机制:

优缺点

优点

缺点

流程图:

2、case循环语句应用示例

案例1:猜数字

案例2:周末快到了


一、for循环语句

1、for语句结构

for循环的运作方式,是将列表的元素一一取出,依序放入指定的变量中,然后重复执行含括的命令区域(在dodone 之间),直到所有元素取尽为止。其中,列表是一些字符串的组合,彼此用分隔符(如空格符)隔开,这些字符串称为字段。

for 变量名 in 列表; do
    循环体,即需要重复执行的命令  
done

或

for 变量 in 列表
do
   循环体,即需要重复执行的命令  
done
使用场景

for 循环适用于需要遍历一个列表(如数组、文件列表、字符串列表等)并对每个元素执行相同操作的场景中。它允许指定一个元素列表,并逐个取出列表中的元素,对每个元素执行相应的代码块。通过使用 for 循环,可以轻松地处理列表中的每个元素,无需手动编写重复的代码,提高了脚本的效率和可读性。

执行机制
  • 依次将列表中的元素赋值给“变量名” ; 每次赋值后即执行一次dodone之间的循环体; 直到列表中的元素耗尽,循环结束。
列表生成方式
  1. 直接给出列表
  2. 整数列表:{start..end}, $(seq [start [step]] end)
  3. 返回列表的命令:$(COMMAND)
  4. 使用glob通配符,如:*. sh
  5. 变量引用

注意:

  • for循环的取值列表中使用空格、制表符(tab)、换行符或其他空白字符来进行取值之间的分隔。
  • 在Shell脚本里 for 循环和 while 循环中,位于dodone关键字之间的命令序列被称为循环体。

优缺点

优点
    1. 明确且简洁:for循环清晰地定义了循环的初始值、条件和更新步骤,使代码更易于阅读和理解。
    2. 可控性强:通过设定条件,可以精确控制循环的执行次数。
    3. 高效:适合执行固定次数的循环操作。
缺点
    1. 灵活性有限:相比while循环,for循环在动态改变循环条件方面较为受限。
    2. 可读性挑战:复杂的for循环可能降低代码可读性。
    3. 潜在风险:不当的循环条件或变量更新可能导致无限循环。
    4. 资源消耗:在迭代次数多或操作复杂时,可能消耗较多资源。

流程图

2、for循环语句应用示例


实例1:列出循环次数

#!/bin/bash
echo TIME:2024-05-10
echo AUTHOR:'闫小雨'
for i in 1 2 3;do            #写了一个变量 “i”,列表写了3个参数,
echo "$i"                    #打印一下i这个变量的值
done                         #for循环结束

[root@yanxy502 ~] sh for.sh 
TIME:2024-05-10
AUTHOR:闫小雨
1
2
3


实例2:创建文件夹

#!/bin/bash  
# TIME:2024-05-10  
# AUTHOR:'闫小雨'  
  
for k in $(seq 1 10)  
do  
   mkdir /home/yanxiaoyu/aaa${k}        # 在/home/yanxiaoyu/目录下创建文件夹aaa${k}  
   cd /home/yanxiaoyu/aaa${k}  
   for l in $(seq 1 10)  
   do  
      mkdir bbb${l}                    # 在aaa${k}目录下创建文件夹bbb${l}  
   done  
   cd ..  
done

[root@yanxy502 ~] vim for.sh 
[root@yanxy502 ~] sh for.sh 
[root@yanxy502 ~] ls /home/
Test  yanxiaoyu
[root@yanxy502 ~] ls /home/yanxiaoyu/
aaa1  aaa10  aaa2  aaa3  aaa4  aaa5  aaa6  aaa7  aaa8  aaa9

二、While循环语句

1、while语句结构

while循环用于重复执行一段代码,直到指定的条件不再满足为止。

#当条件测试成立(条件测试为真),执行循环体
while [ 条件测试 ]  
do  
    循环体,即需要重复执行的命令  
done

或

while 条件测试
do
    循环体,即需要重复执行的命令  
done
使用场景

while循环用于重复执行一段代码,直到指定的条件不再满足为止的场景中。它常用于处理需要迭代执行的任务,如遍历文件列表、按次数执行操作、等待用户输入等,直到满足特定的退出条件为止。通过 while 循环,可以方便地控制代码块的重复执行次数和条件。

执行机制

只要指定的条件为真,就重复执行循环体内的代码,直到条件不再满足为止。

优缺点

优点
    1. 灵活性强:while循环可以根据任意条件来重复执行代码块,可以基于复杂的逻辑或外部输入来决定循环是否继续。
    2. 清晰直观:while循环的结构清晰明了,容易理解。通常包括一个条件判断和一个循环体,条件判断决定循环是否继续执行,而循环体包含需要重复执行的代码。
    3. 适合处理未知次数的迭代:当循环的迭代次数不确定时,它可以根据条件来动态地决定循环的次数。
缺点
  1. 无限循环的风险:如果没有正确设置退出条件,while循环可能会变成无限死循环,导致程序无法停止或响应,可能会消耗大量资源或导致系统崩溃。
  2. 依赖外部条件:while循环的执行依赖于外部条件的变化。如果外部条件没有按预期变化,循环可能会永远继续下去成为死循环,从而导致程序逻辑错误或性能问题。
  3. 需要谨慎处理条件判断:在使用while循环时,需要特别注意条件判断的逻辑和准确性。如果条件判断有误,可能会导致循环无法正常执行或产生不可控制的结果。

流程图:

2、while循环语句应用示例


实例1:倒计时

#!/bin/bash
#TIME 2025-05-10
#AUTHON "闫小雨" 

# 读取用户输入的倒计时秒数  
read -p "请输入倒计时秒数(正整数): " COUNTDOWN

# 检查输入是否为正整数  
if ! [[ $COUNTDOWN =~ ^[0-9]+$ ]]; then
    echo "错误:请输入一个正整数作为倒计时秒数。"  
    exit 1
fi

# 开始倒计时循环  
while [ $COUNTDOWN -gt 0 ]; do
    echo -ne "$COUNTDOWN\r"  # \r 用于回显到同一行  
    sleep 1
    ((COUNTDOWN--))
done

echo "倒计时结束!" 

[root@yanxy502 ~] vim while.sh 
[root@yanxy502 ~] sh while.sh 
请输入倒计时秒数(正整数): 5
#5		#该数字为变动数字,倒计时从5到0;
#4
#3
#2
#1
倒计时结束! 


实例2:猜谜码

定义了一个预设的密码 PASSWORD 和一个空的变量 GUESS 来存储用户的猜测,使用 while 循环来持续读取用户的输入,直到输入与预设的密码匹配,在循环内部,使用 read 命令来读取用户的输入,使用 if 语句来检查用户的猜测是否与预设的密码匹配。如果不匹配,则输出一个错误消息,在每次输出一个错误消息后,使用 echo 命令来输出一个换行符,以便在下一行显示消息或提示,当用户的猜测与预设的密码匹配时,while 循环的条件不再满足,循环结束,最后,输出一个恭喜消息来告诉用户猜对了密码。

#!/bin/bash  
# TIME 2025-05-10  
# AUTHOR "闫小雨" 

PASSWORD="password"                             # 这是预设的密码  
GUESS=""

while [ "$GUESS" != "$PASSWORD" ]; do           # 使用 while 循环来持续读取用户的猜测,直到猜测正确
    read  -p "请输入你的猜测: " GUESS
    echo                                        # 使用 echo 打印空白行,显示下一个提示或消息  

                                                
    if [ "$GUESS" != "$PASSWORD" ]; then        # 这里再次检查 "$GUESS" != "$PASSWORD",为了清晰可见猜测错误时给出提示
        echo "错误!再试一次。"    
    fi
done
                                                  
echo "恭喜!你猜对了密码。"                     # 当猜测正确时,显示恭喜消息

[root@yanxy502 ~] vim while.sh 
[root@yanxy502 ~] sh while.sh 
请输入你的猜测: abcd
错误!再试一次。

请输入你的猜测: 12345
错误!再试一次。

请输入你的猜测: a1b2c3 
错误!再试一次。

请输入你的猜测: password
恭喜!你猜对了密码。


三、case分支语句

1、case语句结构

case语句用于进行多条件选择。它的语法结构类似于其他编程语言中的 switch 语句。case语句会检查一个变量或表达式的值,并将其与多个模式进行比较。如果找到匹配的模式,就会执行相应的命令序列,直到遇到;;esac( case 的反写)为止。

case 变量 in  
    模式1)  
        # 在这里放置命令序列,当变量与模式1匹配时执行  
        ;;  
    模式2)  
        # 在这里放置命令序列,当变量与模式2匹配时执行  
        ;;  
    ...  
    *)  
        # 默认情况,当变量与任何模式都不匹配时执行  
        ;;  
esac

;; 表示当前case分支的结束。当case表达式与某个case标签匹配时,Shell会执行该case分支下的所有命令,直到遇到;;为止。然后它会跳出当前的case分支,不再继续执行该分支下的后续命令。

使用场景

case分支语句适用于需要基于单个变量的不同值来执行不同操作的场景中。它常用于处理用户输入、命令行参数、配置文件选项等,使得脚本能够根据不同的条件执行相应的代码块

执行机制:

根据传入的字符串与一系列模式进行匹配,并执行匹配到的第一个case标签后的命令,直到遇到;;esac( case 的反写)为止。

优缺点

优点
    1. 结构清晰: case 语句可以使代码更加结构化,因为它允许将不同的处理逻辑分组到不同的分支中。
    2. 避免冗余:在case语句中,每个条件都对应一个独立的代码块,避免了在多个条件中重复编写相同的代码。
    3. 易于扩展:当需要添加新的条件时,只需在case语句中添加一个新的分支即可,无需对整个逻辑结构进行重大修改。
    4. 基于值的选择:case语句根据表达式的值来选择要执行的代码块,这在处理枚举类型或离散值时特别有用。
缺点
  1. 局限性:case 语句主要基于字符串比较,因此在处理非字符串类型(如整数或浮点数)时可能不太方便。对于复杂的逻辑判断可能不够灵活。
  2. 不支持复杂逻辑:case语句的每个分支都是独立的,不支持跨分支的逻辑运算或条件组合。
  3. 默认行为:如果case语句中没有匹配的分支且没有指定默认分支,程序可能不会执行任何操作。
  4. 可读性:当条件分支过多时,case语句可能会使代码变得冗长和难以阅读。

流程图:


2、case循环语句应用示例


案例1:猜数字

使用read命令来提示用户输入一个数字,并将输入存储在变量number中。case语句用于检查$number的值,并根据不同的值执行相应的命令序列。使用通配符[4-6]来匹配4、5或6这三个数字。使用了模式[0-9]*来匹配任何以数字开头的字符串(这实际上会匹配任何包含数字的字符串,但在这个上下文中,可以假设用户只输入了数字)。*)是默认情况,用于处理任何不匹配前面任何模式的情况。

#!/bin/bash 
# TIME 2025-05-10  
# AUTHOR "闫小雨"
  
# 提示用户输入一个数字  
read -p "请输入一个数字(1-3):" number 
  
# 使用case语句来处理用户的输入  
case $number in  
    1)  
        echo "你输入了数字1"  
        # 这里可以添加更多的命令来处理数字1的情况  
        ;;  
    2)  
        echo "你输入了数字2"  
        # 处理数字2的情况  
        ;;  
    3)  
        echo "你输入了数字3"  
        # 处理数字3的情况  
        ;;  
    # 使用通配符来匹配多个值  
    [4-6])  
        echo "你输入了4, 5, 或 6之间的数字"  
        ;;  
    # 使用模式匹配来检查特定的字符串格式  
    [0-9]*)  
        echo "你输入了一个数字,但它不在1到3的范围内"  
        ;;  
    # 使用*)作为默认情况  
    *)  
        echo "你输入的不是一个数字,或者输入了非法字符"  
        ;;  
esac 

[root@yanxy502 ~] vim case1.sh 
[root@yanxy502 ~] bash case1.sh 
请输入一个数字(1-3):5
你输入了4, 5, 或 6之间的数字
[root@yanxy502 ~]# bash case1.sh 
请输入一个数字(1-3):8
你输入了一个数字,但它不在1到3的范围内
[root@yanxy502 ~]# bash case1.sh 
请输入一个数字(1-3):y
你输入的不是一个数字,或者输入了非法字符
[root@yanxy502 ~]# bash case1.sh 
请输入一个数字(1-3):2
你输入了数字2


案例2:周末快到了

使用read命令来提示用户输入一个星期,并将输入存储在变量day中。然后使用case语句来检查day变量的值,并根据不同的值输出不同的消息。如果day星期一,则输出今天是星期一!。如果day星期二星期三星期四星期五,则分别输出对应的消息。如果day星期六星期日,则由于使用了|逻辑或,这两个模式被视为一个整体,并输出今天是周末!。如果day的值不匹配任何模式,则执行默认情况*),并输出无效的星期几。

#!/bin/bash
# TIME 2025-05-10  
# AUTHOR "闫小雨"
  
# 提示用户输入一个数字  
read -p "请输入星期 例如 星期一 : " day 
  
# 使用case语句检查day变量的值  
case "$day" in  
    "星期一")  
        echo "今天是星期一!"  
        ;;  
    "星期二")  
        echo "今天是星期二!"  
        ;;  
    "星期三")  
        echo "今天是星期三!"  
        ;;  
    "星期四")  
        echo "今天是星期四!"  
        ;;  
    "星期五")  
        echo "今天是星期五!周末快来了。"  
        ;;  
    "星期六"|"星期日") # 使用 | 逻辑或来匹配多个模式  
        echo "今天是周末!"  
        ;;  
    *)  
        echo "无效的星期几。"  
        ;;  
esac

[root@yanxy502 ~] vim daycase.sh 
[root@yanxy502 ~] bash daycase.sh 
请输入星期,例如'星期一' : 星期一        
今天是星期一!
[root@yanxy502 ~] bash daycase.sh 
请输入星期,例如'星期一' : 星期二   
今天是星期二!
[root@yanxy502 ~] bash daycase.sh 
请输入星期,例如'星期一' : 星期三
今天是星期三!
[root@yanxy502 ~] bash daycase.sh 
请输入星期,例如'星期一' : 星期四
今天是星期四!
[root@yanxy502 ~] bash daycase.sh 
请输入星期,例如'星期一' : 星期五
今天是星期五!周末快来了。
[root@yanxy502 ~] bash daycase.sh 
请输入星期,例如'星期一' : 星期六
今天是周末!
[root@yanxy502 ~] bash daycase.sh 
请输入星期,例如'星期一' : 星期日
今天是周末!
[root@yanxy502 ~] bash daycase.sh 
请输入星期,例如'星期一' : 123
无效的星期几。


  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Shell脚本的if循环是一种条件语句,用于在满足特定条件时执行一系列命令。 语法格式如下: ```bash if [condition]; then commands fi ``` 其中,condition是一个检测条件,如果条件为真,则执行commands中的命令。 另外,还可以在if语句中加入else语句,当条件为假时执行else中的命令。语法格式如下: ```bash if [condition]; then commands1 else commands2 fi ``` 还可以在if语句中加入elif语句,当第一个if条件不成立时,判断elif条件是否成立,如果成立,执行elif中的命令。语法格式如下: ```bash if [condition1]; then commands1 elif [condition2]; then commands2 else commands3 fi ``` 在条件语句中,可以使用各种测试命令,如数字、字符串比较、文件属性测试等。 例如: ```bash if [ $a -eq $b ]; then echo "a is equal to b" elif [ $a -lt $b ]; then echo "a is less than b" else echo "a is greater than b" fi ``` 注意:在条件语句中,要使用两个中括号来表示,并且条件语句中的变量要加$符号 ### 回答2: if循环shell脚本中的条件语句之一,用于根据条件的真假执行相应的代码块。if循环的基本语法如下: ``` if 条件语句 then 执行语句1 else 执行语句2 fi ``` 条件语句可以使用各种测试操作符来判断某个条件是否为真,例如比较操作符(如-e、-eq、-ne、-lt等)用于比较数值,逻辑操作符(如&&、||)用于组合多个条件等等。 在if循环中,如果条件语句为真,则执行`执行语句1`,否则执行`执行语句2`。`执行语句1`和`执行语句2`可以是一条或多条命令,多条命令之间使用分号或者换行进行分隔。 除了基本的if-else结构,还可以使用elif关键字来处理多个条件,例如: ``` if 条件1 then 执行语句1 elif 条件2 then 执行语句2 else 执行语句3 fi ``` 在这个例子中,如果条件1为真,则执行`执行语句1`;如果条件1为假但条件2为真,则执行`执行语句2`;否则执行`执行语句3`。 使用if循环可以根据不同条件来执行不同的代码块,实现分支执行,提高脚本的灵活性和可用性。同时,可以通过组合多个if循环和逻辑操作符来实现更复杂的逻辑判断和处理。 ### 回答3: 在shell脚本中,if循环是控制流结构中的一种,用于根据条件进行分支判断和执行不同的操作。 if循环的语法如下: ```shell if [ condition ]; then # 执行语句块1 elif [ condition2 ]; then # 执行语句块2 else # 执行语句块3 fi ``` 其中`condition`和`condition2`是用于判断的条件表达式,可以使用比较运算符、逻辑运算符等构建。`[]`用于包裹条件表达式,`then`表示如果条件表达式为真,执行接下来的语句块。`elif`表示如果前面的条件不成立,继续判断下一个条件,可以有多个elif语句。`else`表示所有前面的条件都不成立时,执行最后的语句块。`fi`表示if结构结束。 例子: ```shell num=10 if [ $num -gt 0 ]; then echo "正数" elif [ $num -lt 0 ]; then echo "负数" else echo "零" fi ``` 以上代码中,首先判断变量`num`是否大于0,如果是,则输出"正数";如果不满足第一个条件,则继续判断是否小于0,如果是,则输出"负数";如果都不满足,则输出"零"。 在if循环中,还可以使用其他的控制流结构和命令,例如嵌套循环循环语句、函数等,从而实现更复杂的逻辑判断和操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫叫闫小雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值