文章目录一、if 条件语句运维最常用的判断三种结构1. 单分支满足就干2. 双分支满足干这个不满足干那个3. 多分支多个条件挨个匹配条件表达式的五种写法生产经典实战示例 1监控 sshd 服务没运行就启动示例 2传参控制服务示例 3判断字符串是不是数字企业级案例监控 Web 和数据库二、Shell 函数代码复用神器函数语法关键规则基础实战示例 1带颜色输出函数示例 2企业级 URL 检测脚本递归三、case 条件语句写服务脚本首选语法生产经典案例服务控制脚本进阶案例用户管理脚本四、while/until 循环守护进程神器语法while条件成立循环until条件不成立循环基础实战示例 1从 1 加到 100示例 2无限循环监控服务后台运行与任务控制按行读文件的四种方法企业高级实战防 DDoS 脚本五、for 循环批量处理神器两种语法1. 列表型遍历取值2. C 语言型控制次数基础经典题九九乘法表百钱买百鸡企业级批量操作案例示例 1批量修改文件名示例 2批量启动服务示例 3批量检查主机存活示例 4批量备份数据库select 循环做菜单神器写在最后ManWhat can I say兄弟们Shell 光会变量和条件测试只是入门真正干活靠的是流程控制。if 分支做判断、函数封装复用、case 写服务脚本、循环做批量处理这些才是自动化运维的核心骨架。今天把if 条件全场景、Shell 函数封装、case 服务控制、while/for 循环、select 菜单五大块硬骨头啃透从基础语法到企业生产案例全是天天用的干货打开终端跟着敲拒绝眼会手废点赞收藏反复练一、if 条件语句运维最常用的判断if 就是脚本的大脑啥场景都离不开三种结构灵活用。三种结构1. 单分支满足就干if [ 条件 ];then 命令 fi最简单的判断比如目录不存在就创建if [ ! -d /tmp/laoma ];then mkdir /tmp/laoma fi2. 双分支满足干这个不满足干那个if [ 条件 ];then 命令1 else 命令2 fi3. 多分支多个条件挨个匹配if [ 条件1 ];then 命令1 elif [ 条件2 ];then 命令2 else 命令3 fi曼巴忠告写 if 先写 if 和 fi再填中间内容不然写着写着忘了 fi语法错到怀疑人生。还有[]里面两端必须有空格字符串变量一定要加双引号新手 90% 的错都在这。条件表达式的五种写法if 后面的条件不只是[]五种写法各有场景test 表达式最原始写法[ 表达式 ]最常用生产推荐[[ 表达式 ]]扩展写法支持正则匹配(( 表达式 ))纯数值比较专用直接写命令根据命令返回值$?判断0 为成功即为真生产经典实战示例 1监控 sshd 服务没运行就启动#!/bin/bash systemctl is-active sshd /dev/null if [ $? -ne 0 ];then echo sshd挂了正在启动... systemctl start sshd fi示例 2传参控制服务脚本接收 start/stop/status 参数控制对应服务#!/bin/bash action$1 if [ $action start -o $action stop -o $action status ];then systemctl $action sshd else echo 用法: $0 start|stop|status fi示例 3判断字符串是不是数字四种生产常用方法按需挑选# 方法1变量子串替换删完数字看空不空 [ -z ${string//[0-9]/} ] echo 是数字 || echo 不是数字 # 方法2双中括号正则匹配 [[ $string ~ ^[0-9]$ ]] echo 是数字 || echo 不是数字 # 方法3expr加法判断返回值 expr $string 1 /dev/null [ $? -eq 0 ] echo 是数字 || echo 不是数字 # 方法4sed替换数字后判空 [ -n $(echo $string | sed s/[0-9]//g) ] echo 不是数字 || echo 是数字企业级案例监控 Web 和数据库监控服务三种经典思路看端口、看进程、模拟访问。本地监控ss看端口、ps看进程远程监控nmap扫端口、curl访问页面数据库监控mysql 客户端连库执行命令看返回值# 端口监控MySQL if ss -lnt | grep -q :3306;then echo MySQL运行正常 else echo MySQL挂了 fi # curl监控Web站点 if curl -s --timeout5 www.laoma.cloud /dev/null;then echo 网站正常 else echo 网站挂了 fi二、Shell 函数代码复用神器重复的代码别一遍遍写封装成函数调用就行改一处全生效。函数语法三种写法都能用推荐标准写法function 函数名() { 命令... return 返回值 }关键规则先定义后调用必须写在调用前面不然报命令不存在调用直接写函数名不用加括号传参直接跟后面空格分开函数里的$1/$2是函数的参数不是脚本的参数return退出函数exit退出整个脚本别搞混函数里用local定义局部变量出了函数就失效不污染全局基础实战示例 1带颜色输出函数运维日志一眼就能区分状态#!/bin/bash function print_status() { case $1 in PASS) echo -e \033[1;32mPASS\033[0m ;; FAIL) echo -e \033[1;31mFAIL\033[0m ;; DONE) echo -e \033[1;35mDONE\033[0m ;; esac } print_status PASS示例 2企业级 URL 检测脚本模块化拆分主函数 功能函数清晰好维护#!/bin/bash function usage() { echo 用法: $0 网址 exit 1 } function check_url() { wget --spider -q -o /dev/null --tries1 -T 5 $1 [ $? -eq 0 ] echo $1 正常 || echo $1 异常 } function main() { [ $# -ne 1 ] usage check_url $1 } main $*递归函数自己调用自己比如阶乘、累加了解就行生产用得不多。⚠️ 警告别瞎玩 fork 炸弹:(){ :|: };:无限制生成进程直接打满系统生产环境严禁执行三、case 条件语句写服务脚本首选case 就是多分支 if 的工整版适合固定选项的场景比如服务的 start/stop/restart/status写出来比 if 清爽太多系统服务脚本基本都用它。语法case $变量 in 值1) 命令... ;; 值2) 命令... ;; *) 默认命令... ;; esac记忆小技巧case 开头esac 结尾case 倒过来写每个选项跟)结尾两个分号;;*)是默认兜底。生产经典案例服务控制脚本#!/bin/bash case $1 in start) systemctl start sshd echo sshd已启动 ;; stop) systemctl stop sshd echo sshd已停止 ;; restart|reload) systemctl restart sshd echo sshd已重启 ;; status) systemctl status sshd ;; *) echo 用法: $0 start|stop|restart|reload|status exit 1 ;; esac曼巴忠告固定选项的场景用 case比 if-elif-else 工整易读运维写服务启动脚本首选。进阶案例用户管理脚本结合函数、case、if实现用户增删查#!/bin/bash # 必须root运行 [ $UID -ne 0 ] echo 请用root执行 exit 1 user_file/etc/users [ -f $user_file ] || touch $user_file function search_user() { if grep -q username: $1 $user_file;then echo $1 存在 return 0 else echo $1 不存在 return 1 fi } case $1 in -a|--add) search_user $2 /dev/null [ $? -eq 0 ] echo 用户已存在 || { echo username: $2 $user_file echo 添加成功 } ;; -d|--del) search_user $2 /dev/null [ $? -eq 1 ] echo 用户不存在 || { sed -i /username: $2/d $user_file echo 删除成功 } ;; -s|--search) search_user $2 ;; *) echo 用法: $0 -a|-d|-s 用户名 ;; esac四、while/until 循环守护进程神器while 就是条件成立就一直循环until 反过来条件不成立才循环。while 最适合做守护进程、持续监控。语法while条件成立循环while [ 条件 ] do 命令 doneuntil条件不成立循环until [ 条件 ] do 命令 done基础实战示例 1从 1 加到 100#!/bin/bash i1 sum0 while ((i100)) do ((sumi)) ((i)) done echo 12...100$sum示例 2无限循环监控服务每隔 5 秒检查一次服务挂了就重启#!/bin/bash while true do systemctl is-active sshd /dev/null if [ $? -ne 0 ];then systemctl restart sshd fi sleep 5 done曼巴忠告无限循环必须加 sleep不然 CPU 直接打满生产事故。监控频率按需来不用太频繁。后台运行与任务控制脚本跑一半不想中断放后台执行脚本 后台运行CtrlZ暂停当前任务bg暂停的任务放后台继续fg后台任务调前台fg 编号调指定任务jobs查看当前所有后台任务kill %编号终止指定任务按行读文件的四种方法处理日志、配置文件天天用四种写法按需选# 方法1exec输入重定向 exec 文件 while read line do echo $line done # 方法2管道cat进来 cat 文件 | while read line do echo $line done # 方法3done后面重定向 while read line do echo $line done 文件 # 方法4IFS设为换行for循环遍历 IFS$\n for line in $(cat 文件) do echo $line done企业高级实战防 DDoS 脚本分析访问日志单 IP 请求超阈值直接封 IP#!/bin/bash log_file$1 while true do # 统计每个IP的请求数 awk {print $1} $log_file | sort | uniq -c /tmp/ip_count.tmp exec /tmp/ip_count.tmp while read count ip do # 超过500次且没封过就封掉 if [ $count -gt 500 ] ! iptables -L -n | grep -q $ip;then iptables -I INPUT -s $ip -j DROP echo $ip 已封禁 /tmp/drop_$(date %F).log fi done sleep 3600 # 一小时统计一次 done五、for 循环批量处理神器for 循环适合已知次数的循环批量操作、遍历列表首选。两种写法列表型和 C 语言型。两种语法1. 列表型遍历取值for 变量 in 列表 do 命令 done适合遍历文件、主机列表、字符串集合。2. C 语言型控制次数for ((i1;i10;i)) do 命令 done适合知道循环次数的数值计算。基础经典题九九乘法表#!/bin/bash for i in {1..9} do for ((j1;ji;j)) do echo -en $j*$i$((j*i))\t done echo done百钱买百鸡经典算法题公鸡 5 文母鸡 3 文小鸡 3 只 1 文百钱买百鸡#!/bin/bash for ((cock1;cock20;cock)) do for ((hen1;hen33;hen)) do chick$((100-cock-hen)) if [ $((cock*5 hen*3 chick/3)) -eq 100 ] [ $((chick%3)) -eq 0 ];then echo 公鸡$cock 母鸡$hen 小鸡$chick fi done done企业级批量操作案例示例 1批量修改文件名把所有 txt 后缀改成 jpg#!/bin/bash for file in *.txt do mv $file ${file%.txt}.jpg done示例 2批量启动服务#!/bin/bash for svc in nginx mariadb crond do systemctl enable --now $svc done示例 3批量检查主机存活#!/bin/bash for ip in 192.168.1.{1..254} do ping -c1 -W1 $ip /dev/null [ $? -eq 0 ] echo $ip 在线 || echo $ip 离线 done想提速done后面加并发执行扫描速度直接起飞。示例 4批量备份数据库#!/bin/bash for db in web1 web2 app do mysqldump -uroot $db /backup/${db}_$(date %F).sql doneselect 循环做菜单神器select 专门用来做字符菜单自动列选项输入序号执行对应功能#!/bin/bash PS3请选择操作: select op in 启动Nginx 重启Nginx 退出 do case $op in 启动Nginx) systemctl start nginx echo 已启动 ;; 重启Nginx) systemctl restart nginx echo 已重启 ;; 退出) exit ;; *) echo 请输入1-3 ;; esac done写在最后ManWhat can I sayif 判断、函数封装、case 分支、while 守护、for 批量这五个是 Shell 自动化的骨架。基础打牢了监控脚本、批量运维、自动化部署、日志分析全是手到擒来。一定要终端亲手敲写服务脚本、监控脚本、批量处理文件、经典算法题每个坑都踩一遍比背十页笔记都管用。万丈高楼平地起Shell 流程控制打牢了后面运维自动化直接快人一步。后续持续更新 Shell 进阶实战干货欢迎点赞收藏关注一起持续打怪升级Mamba out