Day 4:Shell流程控制——从“直线思维“到“智能决策“的进化

目录

    • 一、if语句:你以为简单其实暗藏杀机
      • 1. 基础语法(看似简单却容易踩坑)
      • 2. 安全写法规范(企业级建议)
    • 二、条件测试的六大门派
      • 1. 文件测试(运维最爱)
      • 2. 字符串比较(引号是灵魂)
      • 3. 数字比较(别再用>了!)
    • 三、case语句:比if更优雅的多路分支
      • 1. 基础用法(菜单系统必备)
      • 2. 高级模式匹配(支持通配符)
    • 四、实战:智能文件处理器
    • 五、避坑指南:生产环境经验
      • 1.总是检查返回值:
      • 2.防御性编程:
      • 3.避免过度嵌套:
    • 六、性能优化技巧
      • 1. 条件顺序优化
      • 2. 使用case代替多层if
    • 课后挑战:智能日志分析器

开篇:当你的脚本需要做选择

想象你在教机器人泡咖啡:

  • 直线脚本:只会按固定步骤操作(烫伤顾客预警!)
  • 智能脚本:能判断"如果糖不够,就提醒补货"、“当水温>90℃时停止加热”

今天我们要把这种决策能力赋予Shell脚本,让你告别"一根筋"式编程!

一、if语句:你以为简单其实暗藏杀机

1. 基础语法(看似简单却容易踩坑)

if [ 条件 ]; then命令
elif [ 条件 ]; then命令
else命令
fi

经典错误案例:

# 错误1:忘记then
if [ -f file.txt ]echo "存在"  # 会报错# 错误2:多余分号
if [ -d dir ]; then;  # 多了一个分号echo "存在"
fi

2. 安全写法规范(企业级建议)

# 推荐风格:then换行,条件加空格
if [[ -f "/etc/passwd" ]]
thenecho "关键文件存在"
fi

二、条件测试的六大门派

1. 文件测试(运维最爱)

[ -e "/path" ]    # 存在即可(文件/目录都行)
[ -S "/tmp/mysql.sock" ]  # 是否是socket文件
[ -N "/etc/hosts" ]  # 文件是否被修改过

2. 字符串比较(引号是灵魂)

name=""
[ -z "$name" ] && echo "姓名为空"  # 判断空字符串
[ -n "$PATH" ] || echo "PATH居然为空?"  # 判断非空

3. 数字比较(别再用>了!)

[ 10 -gt 5 ]  # 大于
[ $? -eq 0 ]  # 判断上条命令是否成功
[ $RANDOM -lt 10000 ] && echo "幸运数字"

三、case语句:比if更优雅的多路分支

1. 基础用法(菜单系统必备)

read -p "输入命令(start|stop|restart): " cmd
case "$cmd" instart)echo "服务启动中...";;stop)echo "服务停止中...";;*)echo "无效命令!"exit 1;;
esac

2. 高级模式匹配(支持通配符)

case "$HOSTNAME" innode[1-9])echo "这是集群节点";;db-*)echo "这是数据库服务器";;
esac

四、实战:智能文件处理器

   #!/bin/bash
# 根据文件类型自动处理file="$1"if [[ ! -e "$file" ]]; thenecho "错误:文件不存在" >&2exit 1
ficase $(file -b "$file") in*"ASCII text"*)echo "文本文件 - 显示前5行:"head -n 5 "$file";;*"Zip archive"*)echo "压缩包 - 查看内容:"unzip -l "$file" | head -10;;*"PDF"*)echo "PDF文件 - 提取文本:"pdftotext "$file" - | head -n 10;;*)echo "未知文件类型";;
esac

运行效果:

$ ./file_proc.sh test.pdf
PDF文件 - 提取文本:
Chapter 1
Introduction to Shell...

五、避坑指南:生产环境经验

1.总是检查返回值:

if ! cp file1 file2; thenecho "复制失败!" >&2exit 1
fi

2.防御性编程:

dir="/data/logs"
[ -d "$dir" ] || mkdir -p "$dir" || exit 1

3.避免过度嵌套:

# 不好:
if [ 条件1 ]; thenif [ 条件2 ]; then...fi
fi# 更好:
[ 条件1 ] && [ 条件2 ] && 命令

六、性能优化技巧

1. 条件顺序优化

# 把高概率条件放前面
if [[ $RANDOM -lt 1000 ]]; thenecho "小概率事件"
elif [[ $RANDOM -gt 10000 ]]; thenecho "常见情况"
fi

2. 使用case代替多层if

# 测试速度差异(case通常更快)
time {for i in {1..1000}; docase "$i" in1) ;; 2) ;; ...esacdone
}

课后挑战:智能日志分析器

需求:

  • ✅ 分析/var/log/syslog(或其他日志)
  • ✅ 根据关键词(ERROR/WARNING等)统计出现次数
  • ✅ 用不同颜色输出不同级别日志

进阶要求:

  • ⚠️ 当日志文件过大时(>100MB)自动启用less查看

示例输出:

$ ./log_analyzer.sh
ERROR  : 15(显示红色)
WARNING: 28(显示黄色)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86008.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式训练中的随机种子策略:深入理解与实践指南

分布式训练中的随机种子策略:深入理解与实践指南 引言:一个容易被忽视的关键细节 在深度学习的分布式训练中,你是否见过这样的代码? torch.manual_seed(process_seed) # PyTorch操作 random.seed(process_seed) # Pyth…

金山办公发布WPS智慧教育平台,发力教育AI意义何在?

钛媒体消息,金山办公发布面向教育用户的 WPS 智慧教育平台,面对着金山办公的发力,我们该怎么分析呢? 首先,从市场拓展与用户需求响应角度看,金山办公此次推出WPS智慧教育平台,直接瞄准了教育领…

无人机航电系统之语音通信技术篇

无人机航电系统的语音通信技术是确保无人机与地面控制站、其他无人机或相关人员之间实现高效、稳定语音交互的关键技术,在军事侦察、应急救援、物流运输、航拍测绘等众多领域发挥着至关重要的作用。 一、技术原理 无人机航电系统的语音通信技术主要基于无线通信原理…

element plus 的树形控件,如何根据后台返回的节点key数组,获取节点key对应的node节点

在使用 Element Plus 的 el-tree 组件时,如果后端返回的节点 key 数组中包含了部分选中的父级节点的 key,可能会导致该父级节点下的所有子节点也被默认选中。这是因为 el-tree 的默认行为是:如果一个父节点被选中,那么其所有子节点…

什么是Sentinel

什么是 Sentinel? 在分布式系统中,服务间的依赖关系错综复杂。一个服务的故障,很可能像多米诺骨牌一样,迅速蔓延并导致整个系统崩溃,这就是我们常说的“雪崩效应”。为了避免这种灾难性后果,我们需要一种强大的机制来保护我们的系统,而 Sentinel 正是为此而生。 Senti…

AWS 使用图形化界面创建 EKS 集群(零基础教程)

无需命令行!通过 AWS 控制台图形化操作,轻松创建 Kubernetes 集群。 文章目录 文章简介 一、准备工作:登录 AWS 控制台 二、创建 EKS 集群(控制面) 1. 创建 EKS 集群 2. 设置集群基本信息 3. 配置网络设置 三、添加…

[C#] Winform - 进程间通信(SendMessage篇)

一、发送端 // 窗体:发送端 public partial class SendForm : Form {public SendForm(){InitializeComponent();}// 按钮:发送private void btnSend_Click(object sender, System.EventArgs e){IntPtr hwnd User32Helper.FindWindow(null, "接收端…

锂电池保护板测试仪:守护电池安全的幕后保障

在电动汽车、储能电站和便携式电子设备中,锂电池作为核心动力源,其能量密度与安全性始终是行业关注的焦点。锂电池在过充、过放、短路等异常情况下可能引发起火甚至爆炸,而锂电池保护板正是解决这一问题的关键组件。为确保保护板性能可靠&…

Qemu搭建RISC-V,运行opensbi+u-boot+img

✨1.先下载一个Ubuntu镜像 https://cdimage.ubuntu.com/releases/24.04/release/ 我这里下载的是这个RISC-V的 🌟1.2.解压镜像 xz -d ubuntu-24.04.2-preinstalled-server-riscv64.img.xz ✨2.准备RISC-V的QEMU 打开qemu官网https://www.qemu.org/&#xff0c…

【实战手册】银河麒麟服务器系统进入单用户模式修改密码(root)指南

目录 前言 一、银河麒麟单用户模式简介 二、进入单用户模式修改密码 三、登录验证新密码 结语 前言 在日常服务器运维工作中,忘记root密码是系统管理员偶尔会遇到的问题。作为国产操作系统的优秀代表,银河麒麟服务器系统提供了通过单用户模式重置r…

偏微分方程通解求解2

题目 求下列方程的通解: { u x y = u x u y u − 1 ; u x y = u x u y ; u x y = u x u y u u 2 + 1 ; \begin{cases} u_{xy} = u_x u_y u^{-1}; \\ u_{xy} = u_x u_y; \\ u_{xy} = \dfrac{u_x u_y u}{u^2 + 1}; \end{cases} ⎩⎪⎪⎨⎪⎪⎧​uxy​=ux​uy​u−1;uxy​=ux​…

用于算法性能预测的 GNN 框架

大家读完觉得有帮助记得关注和点赞!!! 抽象。 数值黑盒优化中的自动算法性能预测通常依赖于问题特征,例如探索性景观分析特征。这些特征通常用作机器学习模型的输入,并以表格格式表示。然而,这种方法往往忽…

拯救海量数据:PostgreSQL分区表性能优化实战手册(附压测对比)

1 分区表核心原理与生产痛点 物理存储结构决定性能边界 PostgreSQL分区表的本质是继承表路由规则的逻辑封装。当父表被查询时,查询优化器通过CHECK约束快速定位子表,其性能核心取决于: -- 关键系统视图 SELECT relname, relkind, relpages …

【Wi-Fi天气时钟】网络授时

文章目录 1 网络授时概述1.1 什么是网络授时1.2 为什么要使用网络授时2 API概述2.1 什么是API2.2 如何使用API3 淘宝时间API简介4 网络授时流程和AT指令5 网络授时程序设计5.1 API返回信息解析5.2 RTC初始化5.3 必要的后续操作6 结语1 网络授时概述 1.1 什么是网络授时 首先我…

腾讯云IM即时通讯:开启实时通信新时代

一、引言 在当今数字化浪潮席卷全球的时代,即时通讯已然成为互联网世界中不可或缺的关键元素。无论是个人日常生活中的社交互动,还是企业运营里的高效协作,即时通讯都发挥着举足轻重的作用,已然渗透到人们生活与工作的每一个角落…

js逻辑:【增量更新机制】

增量更新机制:在数据发生变化时,只对变化的部分进行更新的策略,而不是每次都重新处理全部数据,即:在数据发生变化时,只对变化的部分进行更新的策略,而不是每次都重新处理全部数据 watch: {base…

详解Redis的LUA脚本、管道 (Pipelining)、事务事务 (Transactions)

1. 管道 (Pipelining) 网络延迟 (Round-Trip Time - RTT) 瓶颈。 在传统模式下,客户端发送一个命令 -> 等待 Redis 服务器处理并返回结果 -> 再发送下一个命令。如果客户端需要执行大量命令(例如设置或获取多个键),每个命令…

SIP 协议中的定时器

SIP(Session Initiation Protocol) 是一种信令协议,广泛用于建立、维持和终止多媒体会话(如VoIP通话)。作为基于UDP等不可靠传输的协议,SIP 通过多个定时器机制来确保消息的可靠传输和状态机的正常运行。 …

【机器学习深度学习】偏置项(Bias)概念

目录 前言 一、先说结论:偏置项是“默认起点” 二、类比理解 类比 1:老师给学生的“基础分” 类比 2:预测房价时的“固定成本” 三、没有偏置项的模型,会有什么问题? 四、在神经网络中,偏置项是神经…

使用数组 海选女主角

问题描述 面试那天,刚好来了m * n个MM,站成一个m * n的队列,副导演Fe(OH)2为每个MM打了分数,分数都是32位有符号整数。 一开始我很纳闷:分数怎么还有负的?Fe(OH)2解释说,根据选拔规则&#xff…