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

Shell 秘典(卷三)——循环运转玄章 与 case 分脉断诀精要

文章目录

  • 前言
  • 一、for 循环
    • 1.1 for循环概述
    • 1.2 for循环两种常用形式:
      • 1.2.1 方式一:用于数值方面的处理
      • 1.2.2 方式二:遍历列表
    • 1.3 案例1:实现打印5次HelloWorld
    • 1.4 案例2:求10以内数值的累加和
    • 1.5 案例3:打印动物名称
    • 1.6 案例4:把指定目录下所有的文件名打印出来
    • 1.7 案例5:需求:有一个IP地址的文件(ipddr.txt),需要 ping 文件中的IP(主机)判断是否能通
    • 1.8 案例6:统计 /var/log 有多少文件并显示文件名
    • 1.9 案例7:需要ping通某个网段机器,并且输出反馈结果
    • 1.10 案例8:打印九九乘法表
    • 1.11 案例9:在当前系统下随机生成密码
  • 二、 while 循环
    • 2.1 while 循环概述
    • 2.2 案例1:计算10以内数值的累加和
    • 2.3 案例2:演示while死循环
    • 2.4 案例3:需求 : 监控某个服务的运行状态
  • 三、case 语句
    • 3.1 case语句概述
    • 3.2 案例1:使用case进行服务控制
    • 3.3 案例2:用 case 编写一个查看 cpu 内存 硬盘 资源使用情况
  • 总结

前言

Shell 秘典,乃 Linux/Unix 修仙界中执掌自动化运维、料理日常要务的无上法门。前卷已揭晓号令延展秘术if 天机判语篇的玄机,今卷将继续深入 Shell 秘典的循环运转之道分支断诀之法,助修士在系统界域中运筹帷幄,掌控万物循环之机。​

本文将以循环运转玄章为核心,详解 forwhile 两大循环神通的运转机理与实战妙用;更将揭开 case 分脉断诀的精要,以多分支判断之术,助修士在复杂情境中精准断事、分脉而行。文中穿插大量真实界域实战案例,宛若修仙大能亲临指点,步步引领修士掌握循环与分支的至高心法。​

无论你是初涉 Shell 修行之路的新晋修士,还是已在运维大道上行进多年的老牌行者,本卷皆能助你巩固根基、突破瓶颈,真正掌握 Shell 秘典中循环与分支的玄机,成为系统界域中真正的掌控者。


一、for 循环

1.1 for循环概述

循环控制:程序通过重复执行特定代码段来实现循环功能。为避免死循环,必须设置终止条件。

一个完整的循环结构应包含以下三个要素:

  1. 循环初始值
  2. 循环条件判断
  3. 循环条件更新机制
# for循环格式
for((循环初始值; 循环条件; 修改循环条件))
do循环体代码(会重复执行的程序代码)
done

1.2 for循环两种常用形式:

1.2.1 方式一:用于数值方面的处理

for ((初始值; 限制值; 执行步长))
do程序段
done解释:
- 初始值:循环的起始值(如:i=0)
- 限制值:循环的终止条件(如:i<=5)
- 执行步长:每次循环后的增量变化(如:i++)

例如:

for ((i=0; i<=5; i++))
doecho "$i"    # 打印 0,1,2,3,4,5
done

也可以写成

for ((i=0; i<=5; i++)); do echo "$i"; done

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

1.2.2 方式二:遍历列表

for var in con1 con2 con3 …
doecho $var
done

循环流程:

  1. 第一次循环时,$var的内容是con1
  2. 第二次循环时,$var的内容是con2
  3. 第三次循环时,$var的内容是con3

也可以写成:

for N in 1 2 3; do echo $N; done
或者
for N in {1..3}; do echo $N; done

1.3 案例1:实现打印5次HelloWorld

#!/bin/bash
for ((i = 0; i < 5; i++))
doecho "HelloWorld"
done

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

1.4 案例2:求10以内数值的累加和

#!/bin/bash
# 定义变量
count=0 # 存储累加计算的结果
# 循环:计算
for((i=1;i<=10;i++))
docount=$((count+i));
done
# 输出计算后的结果
echo "累加后的值:${count}"

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

1.5 案例3:打印动物名称

#!/bin/bash
for animal in cat dog elephant
doecho ${animal}
done

在这里插入图片描述

在这里插入图片描述

1.6 案例4:把指定目录下所有的文件名打印出来

#!/bin/bash
###查询/opt/shellodemo目录下所有的文件名,并赋值给filelist变量
filelist=$(ls /opt/shelldemo)
###循环遍历filelist,获取每一个文件名
for filename in $filelist
do#输出文件名echo "$filename"
done

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

1.7 案例5:需求:有一个IP地址的文件(ipddr.txt),需要 ping 文件中的IP(主机)判断是否能通

# 创建ipddr.txt
vim /opt/ipaddr.txt

在这里插入图片描述

#!/bin/bash
ip_list=$(< /home/ipaddr.txt)
for ip in $ip_list
doif ping -c 2 -w 3 $ip &> /dev/null; thenecho "Host $ip is up"elseecho "Host $ip is down"fi
done

在这里插入图片描述

在这里插入图片描述

1.8 案例6:统计 /var/log 有多少文件并显示文件名

#!/bin/bashcd /var/log
count=0
for file in $(ls -R *)
doif [ -f "$file" ]; thenecho "文件名:$file"((count++))fi
done
echo "文件总数量:$count"

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

1.9 案例7:需要ping通某个网段机器,并且输出反馈结果

#!/bin/bash
# 临时文件保存数量,子进程无法修改父进程变量
temp_file=$(mktemp)
echo 0 > "$temp_file"
echo "=====开始检测192.168.10.0/24网段可ping通主机====="for i in {1..254}; do
{ping -c 2 -w 3 "192.168.10.$i" > /dev/null 2>&1if [ $? -eq 0 ]; then# 打印结果echo "主机 192.168.10.$i 可ping通"# 更新数量count=$(cat "$temp_file")echo $((count + 1)) > "$temp_file"fi
} &   # 后台并行执行
done
# 等待执行完成
wait
# 统计数量
echo "该网段下一共 $(cat "$temp_file") 台主机可ping通"
echo "该网段下剩余 $((254 - $(cat "$temp_file"))) 台主机无法ping通"
# 删除临时文件
rm "$temp_file"

在这里插入图片描述

1.10 案例8:打印九九乘法表

#!/bin/bash
# 打印九九乘法表
for((i=1;i<=9;i++))
dofor((j=1;j<=i;j++))doecho -n "$i*$j=$((i*j)) "doneecho
donefor((i=9;i>=1;i--))
dofor((j=1;j<=i;j++))doecho -n "$i*$j=$((i*j)) "doneecho
done

在这里插入图片描述

1.11 案例9:在当前系统下随机生成密码

#!/bin/bash
key="0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
read -p "输出密码长度" num
len=${#key}
for i in $(seq $num)
doindex=$((RANDOM % len))pass=$pass${key:index:1}
done
echo "密码:$pass"

在这里插入图片描述

二、 while 循环

2.1 while 循环概述

while 循环是编程中最基础的控制结构之一,它允许程序在某个条件成立的情况下重复执行一段代码块。

方式一:

while [ expression ]
docommand…修改while中的循环条件
done

案例:

#!/bin/bash
###演示while循环的第一种方式
while [ "$y" != "yes" -a "$y" != "YES" ]
doecho "请输入yes/YES停止循环:"read y ##接收键盘录入的值
done
echo "循环停止了!";

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

方式二:

i=1
while((i<=3))
doecho $ilet i++ # (($i++))
done

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

let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。

方式三: 无限循环(死循环)

while true
do代码
done

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

#!/bin/bash
count=0  # 记录累加值结果
num=1    # 循环初始值
while ((num<=10))
docount=$[count+num]# ((num++))# 使用let命令,计算变量++let num++
done
echo "10以内数值的累加和:${count}";

在这里插入图片描述

在这里插入图片描述

2.3 案例2:演示while死循环

#!/bin/bash
###演示while死循环,如果输出yes退出循环
while true
doecho "请输入字符串:"read y
if [ "$y" == "yes" ]; thenexit 0 ##退出#或者使用break
fi
done

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

2.4 案例3:需求 : 监控某个服务的运行状态

#!/bin/bash
while ps -aux|grep httpd | grep -v grep &> /dev/null
doecho  "httpd 正在运行中"# 每2秒检测一次sleep 2
done
echo "httpd 不在运行中"

在这里插入图片描述

三、case 语句

3.1 case语句概述

case 语句是编程中常用的一种多分支选择结构,其基本语法格式如下:

case $变量名称 in
匹配模式1)程序段
;; # 匹配模式1执行完毕匹配模式2)程序段
;;*) # 默认值,没有匹配的模式程序段
;;
esac # 代表case语句结束

示例:

case $1 in
"hello")echo "Hello World!"
;;"test")echo "testting..."
;;"")echo "$0 没有参数"
;;*)echo "默认"
;;
esac

在这里插入图片描述

在这里插入图片描述

3.2 案例1:使用case进行服务控制

#!/bin/bash
case $1 in 
"start")
systemctl start httpd 
echo "启动服务"
;;"stop")
systemctl stop httpd
echo "httpd服务已关闭"
;;"restart")
systemctl stop httpd 
systemctl start httpd
echo "服务已重启"
;;*)
echo "请你输入正确值: {start|stop|restart}"
;;
esac

在这里插入图片描述

3.3 案例2:用 case 编写一个查看 cpu 内存 硬盘 资源使用情况

#!/bin/bash#提示用户选择查看信息
echo "请选择查看的系统信息:"
echo "1. CPU 使用情况"
echo "2. 内存 使用情况"
echo "3. 硬盘 使用情况"
echo "4. 退出"#用户交互
read -p "请输入选项(1/2/3/4):" numcase $num in 
"1")echo "正在查看CPU使用情况..........."top -bn1| grep "Cpu(s)"
;;"2")
echo "正在查看内存使用情况..........."free -h
;;"3")
echo "正在查看硬盘使用情况..........."df -h
;;"4")
echo "退出程序"exit 0
;;
*)
echo "请输入整数值:1、2、3、4。其他无效"
;;
esac

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

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


总结

本篇精要系统地阐述了 Shell 秘典中循环运转玄章case 分脉断诀两大核心心法,通过大量实战案例与真实界域应用,深入浅出地解析了 forwhile 循环的控制机制与 case 语句的多分支判断技巧。​

修士修习至此,应已掌握:

  • 循环运转之基:包括 for 循环的数值处理与遍历列表、while 循环的条件控制与死循环应对;
  • 实战应用之妙:如批量 ping 测主机、服务状态监控、资源使用查看等常见运维场景;
  • 分脉断诀之精case 语句在多选项判断与服务控制中的高效运用;
  • 编程思维之升:逐步培养出自动化、结构化、可维护的 Shell 编程思维。​

望诸位修士勤加练习,将本篇所授心法融会贯通,真正化为己用,在今后的系统修炼与运维实战中挥洒自如,成就一方系统界域的真正主宰。

📜 修炼无止境,Shell 秘典的下一卷——《函数化形篇》与《数组聚灵术》,即将揭晓,敬请期待。

http://www.xdnf.cn/news/19140.html

相关文章:

  • 访问Nginx 前端页面,接口报502 Bad Gateway
  • 软考 系统架构设计师系列知识点之杂项集萃(137)
  • 如何在 Jenkins Docker 容器中切换到 root 用户并解决权限问题
  • 深入理解 RabbitMQ:从底层原理到实战落地的全维度指南
  • C++之stack类的代码及其逻辑详解
  • 基于DCT-FFT的图像去噪滤波算法
  • GD32入门到实战22--红外NEC通信协议
  • 超越传统SEO:用生成引擎优化(GEO)驱动下一轮增长
  • Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署
  • UI前端大数据可视化实战策略:如何设计符合用户认知的数据可视化界面?
  • JUC并发编程10 - 内存(02) - volatile
  • vscode terminal远程连接linux服务器GUI图形界面
  • 鸿蒙NEXT布局全解析:从线性到瀑布流,构建自适应UI界面
  • 深入理解计算机端口:为什么通信需要端口?
  • 【读论文】质心重分配显微镜实现活样本超分辨成像
  • Qt中的QSS介绍
  • Time-MOE添加MLP分类头进行分类任务
  • 用户自定义字段(Custom Fields)设计方案,兼顾多语言、分组、校验、权限、查询性能、审计与多租户
  • 创维E910V10C_晶晨S905L2和S905L3芯片_线刷固件包
  • HDMI2.1 8K验证平台
  • 【拍摄学习记录】05-对焦、虚化、景深
  • 告别音色漂移!微软超长语音合成模型VibeVoice正式开源​
  • 数列寻方:等差数列和为完全平方数
  • MinIO社区版“背刺“之后:RustFS用Apache 2.0协议重构开源信任
  • Java接口和抽象类的区别,并举例说明
  • 【Spring Cloud Alibaba】前置知识(一)
  • LeetCode 01背包 494. 目标和
  • 2025_WSL2_Ubuntu20.04_C++20_concept 环境配置
  • AntSK知识库多格式导入技术深度解析:从文档到智能,一站式知识管理的技术奇迹
  • zyplayer-doc 开源知识库:部署与使用指南