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 秘典的循环运转之道与分支断诀之法,助修士在系统界域中运筹帷幄,掌控万物循环之机。
本文将以循环运转玄章为核心,详解 for
与 while
两大循环神通的运转机理与实战妙用;更将揭开 case
分脉断诀的精要,以多分支判断之术,助修士在复杂情境中精准断事、分脉而行。文中穿插大量真实界域实战案例,宛若修仙大能亲临指点,步步引领修士掌握循环与分支的至高心法。
无论你是初涉 Shell 修行之路的新晋修士,还是已在运维大道上行进多年的老牌行者,本卷皆能助你巩固根基、突破瓶颈,真正掌握 Shell 秘典中循环与分支的玄机,成为系统界域中真正的掌控者。
一、for 循环
1.1 for循环概述
循环控制:程序通过重复执行特定代码段来实现循环功能。为避免死循环,必须设置终止条件。
一个完整的循环结构应包含以下三个要素:
- 循环初始值
- 循环条件判断
- 循环条件更新机制
# 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
循环流程:
- 第一次循环时,$var的内容是con1
- 第二次循环时,$var的内容是con2
- 第三次循环时,$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 分脉断诀两大核心心法,通过大量实战案例与真实界域应用,深入浅出地解析了 for
、while
循环的控制机制与 case
语句的多分支判断技巧。
修士修习至此,应已掌握:
- 循环运转之基:包括
for
循环的数值处理与遍历列表、while
循环的条件控制与死循环应对; - 实战应用之妙:如批量 ping 测主机、服务状态监控、资源使用查看等常见运维场景;
- 分脉断诀之精:
case
语句在多选项判断与服务控制中的高效运用; - 编程思维之升:逐步培养出自动化、结构化、可维护的 Shell 编程思维。
望诸位修士勤加练习,将本篇所授心法融会贯通,真正化为己用,在今后的系统修炼与运维实战中挥洒自如,成就一方系统界域的真正主宰。
📜 修炼无止境,Shell 秘典的下一卷——《函数化形篇》与《数组聚灵术》,即将揭晓,敬请期待。