Linux之Shell编程(三)流程控制

1. for 循环

for 循环用于重复性执行某段代码,避免死循环,核心需包含循环初始值、循环条件、修改循环条件,有两种主要使用方式。

1.1 方式一:数值处理(固定循环逻辑)

  • 语法格式

    for ((循环初始值; 循环条件; 修改循环条件))
    do
    循环体代码(重复执行的内容)
    done

  • 参数说明

    • 循环初始值:设定循环开始的初始数值,如i=1
    • 循环条件:控制循环是否继续,如i<=5(i 小于等于 5 时循环继续)。
    • 修改循环条件:每次循环后调整初始值,如i++(i 每次加 1)。
  • 简化写法for ((i = 0; i <= 5; i++)); do echo "$i"; done(一行写完,无需换行)。

  • 案例

打印 5 次 HelloWorld

复制代码
#!/bin/bash
for ((i=0;i<5;i++))
do
    echo "$i - Hello World~"
done

求 10 以内数值的累加和

复制代码
#!/bin/bash
count=0  # 存储累加结果
for((i=1;i<=10;i++))
do
    count=$(($count+$i))  # 每次循环累加i的值
done
echo "累加后的值:${count}"  # 输出结果为55

1.2 方式二:遍历数据集(依次取数据)

  • 语法格式

    for 变量名 in 数据1 数据2 数据3 ...
    do
    程序段(对每个数据执行的操作)
    echo $变量名 # 可输出当前遍历的数据
    done

  • 简化写法

    • for N in 1 2 3; do echo $N; done(遍历指定数字)。
    • for N in {1..3}; do echo $N; done(遍历 1 到 3 的连续数字)。
  • 案例

遍历动物名称并输出

复制代码
#!/bin/bash
for animal in cat dog elephant
do
    echo ${animal}  # 依次输出cat、dog、elephant
done

打印指定目录下所有文件名

复制代码
#!/bin/bash
# 查询/root/shelldemo目录下所有文件名,赋值给filelist变量
filelist=$(ls /root/shelldemo)
# 循环遍历filelist,输出每个文件名
for filename in $filelist
do
    echo $filename
done

批量检测 IP 地址的连通性

九九乘法表

随机生成密码

小结

  • 方式一适用于从指定起始值到上限值的循环,需明确初始值、条件和步长。
  • 方式二适用于从数据集(如多个数据、数组)中依次取数据执行操作,直至数据取完。

2. while 循环

while 循环通过判断条件是否成立来控制循环执行,条件为 true 时继续循环,false 时结束,有三种常见使用方式。

2.1 方式一:基于表达式条件循环

  • 语法格式

    while [ 表达式 ]
    do
    command(循环体代码)
    修改循环条件(避免死循环)
    done

  • 案例:输入 yes/YES 停止循环:

    #!/bin/bash

    当输入不是yes且不是YES时,持续提示输入

    while [ "y" != "yes" -a "y" != "YES" ]
    do
    echo "请输入yes/YES停止循环:"
    read y # 接收键盘输入的值
    done
    echo "循环停止了!"

2.2 方式二:基于数值条件循环(用 (()))

  • 语法格式

    变量=初始值
    while((循环条件))
    do
    程序段
    let 变量修改 # 或((变量++)),let无需$表示变量
    done

  • 说明let是 Bash 中用于计算的工具,支持自加(let no++)、自减(let no--)。

  • 案例:计算 10 以内数值的累加和:

    #!/bin/bash
    count=0 # 记录累加结果
    num=1 # 循环初始值
    while((num<=10))
    do
    count=[count+num] # 累加计算 let num++ # num每次加1,修改循环条件 done echo "10以内数值的累加和:{count}" # 输出结果为55

数值循环输出

2.3 方式三:无限循环(死循环,需手动控制退出)

  • 语法格式

    while true
    do
    command(循环体代码)
    # 需在循环内添加退出条件,如if判断+exit
    done

  • 案例:输入 yes 退出无限循环:

    #!/bin/bash
    while true
    do
    echo "请输入字符串:"
    read y
    if [ "$y" == "yes" ]; then
    exit 0 # 输入yes时退出循环
    fi
    done

3. case 语句

case 语句用于多条件匹配,根据变量的不同值执行对应的程序段,类似 "多选一" 逻辑,需以esac结束。

语法格式

复制代码
case $变量名称 in
    匹配模式1 )
        程序段1(变量匹配模式1时执行)
        ;;  # 模式1执行完毕,跳出case
    匹配模式2 )
        程序段2(变量匹配模式2时执行)
        ;;
    * )  # 默认模式,变量不匹配任何上述模式时执行
        默认程序段
        ;;
esac  # case语句结束标记

案例:根据输入参数执行不同操作

复制代码
#!/bin/bash
# 根据传递的参数$1匹配不同模式
case $1 in
    "hello")
        echo "Hello World!"
        ;;
    "test")
        echo "testting..."
        ;;
    "")  # 无参数时匹配
        echo "$0 没有参数"  # $0表示当前脚本名称
        ;;
    *)  # 其他未匹配参数
        echo "默认"
        ;;
esac
  • 执行结果
    • 输入sh casedemo.sh test,输出 "testting..."。
    • 输入sh casedemo.sh hello,输出 "Hello World!"。
    • 直接输入sh casedemo.sh(无参数),输出 "casedemo.sh 没有参数"。
    • 输入sh casedemo.sh other(其他参数),输出 "默认"。

管理 httpd 服务(如 Apache 网页服务)的启动、停止、重启和状态查询

4. 总结

  1. for 循环:用于重复执行代码,分两种方式。一是数值处理,需明确循环初始值、条件和修改逻辑(如遍历 1-10);二是遍历数据集,依次取指定数据或目录文件(如遍历动物名、打印文件名)。
  2. while 循环 :依条件控制循环,共三种方式。基于表达式条件循环(如输入特定值停止)、基于数值条件循环(用(( ))let处理数值,如累加计算)、无限循环(需手动加退出条件,如输入 yes 退出)。
  3. case 语句 :实现多条件匹配,按变量值执行对应程序段,有匹配模式和默认模式,以esac结束(如根据输入参数输出不同内容)。
相关推荐
keep intensify8 分钟前
Redis基础指令全解析:从入门到精通
linux·数据库·c++·redis
Industio_触觉智能11 分钟前
RK3562核心板/开发板RT-Linux系统实时性及硬件中断延迟测试
linux·嵌入式开发·瑞芯微·rk3562·rt linux·xenomai rt·preempt_rt
CodeSheep13 分钟前
大家有没有发现一个奇特现象:你能在一个公司工作 12 年以上,无论你多忠诚多卖力,一旦公司赚的少了,那你就成了“眼中钉肉中刺”
前端·后端·程序员
爱吃生蚝的于勒16 分钟前
【Linux】零基础学会linux环境基础开发工具使用(yum,vim,makefile,gdb)
linux·服务器·数据结构·c++·蓝桥杯·编辑器·vim
亿元程序员18 分钟前
你知道三国志战略版的地图是怎么实现的吗?
前端
本贾尼23 分钟前
Linux系统下的终端,会话,shell,bash,进程组这几个概念的关系。
linux·服务器·网络·ubuntu·bash
Rewloc26 分钟前
IntelliJ IDEA 打包 Web 项目 WAR 包(含 Tomcat 部署+常见问题解决)
前端·tomcat·intellij-idea
devii6628 分钟前
120html
前端
.生产的驴29 分钟前
React useEffect组件渲染执行操作 组件生命周期 监视器 副作用
前端·css·react.js·ajax·前端框架·jquery·html5
零基础的修炼30 分钟前
Linux---线程封装
linux·c++·算法