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

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.dtcms.com/a/359115.html

相关文章:

  • C语言类型转换踩坑解决过程
  • Java高并发架构核心技术有哪些?
  • 安装Redis
  • compute:古老的计算之道
  • 【ROS2】ROS2 基础学习教程 、movelt学习
  • Docker实战避坑指南:从入门到精通
  • plantsimulation知识点 多条RGV驮一台工件图标显示顺序问题
  • lumerical_FDTD_光源_TFSF
  • 【AI】【强化学习】强化学习算法总结、资料汇总、个人理解
  • php连接rabbitmq例子
  • SpringCloud学习笔记
  • 大模型应用开发面试全流程实录:RAG、上下文工程与多Agent协作技术深度解析
  • ABAP 刷新屏幕
  • 【C++】日期类实现详解:代码解析与复用优化
  • BEV-VAE
  • 3000. 对角线最长的矩形的面积
  • 配置vsc可用的C语言环境
  • Linux系统统计用户登录和注销时间的工具之ac
  • Dify的搭建
  • Glato - AI 驱动的广告视频创作平台
  • [光学原理与应用-329]:ZEMAX - 主要用途与主要功能
  • Python爬虫实战:研究统计学方法,构建电商平台数据分析系统
  • Windows驱动开发与双机调试环境[驱动开发环境配置高阶]
  • [创业之路-582]:评估难易程度、重要程度,站在不同的角度有不同的答案
  • 第09章 t检验:两独立样本t检验
  • 【MCP系列教程】 Python 实现 FastMCP StreamableHTTP MCP:在通义灵码 IDE 开发并部署至阿里云百炼
  • 49.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--Refit跨服务调用
  • java中的VO、DAO、BO、PO、DO、DTO
  • 操作系统-虚拟内存篇
  • 数据结构(顺序表力扣刷题)