Shell 流程控制:if 条件判断与 case 分支语句
流程控制是 Shell 脚本的核心功能,通过 if 和 case 语句可以实现根据不同条件执行不同命令的逻辑。本文将详细讲解这两种语句的语法、用法及注意事项。
if 条件判断语句
if 语句通过判断条件的真假来执行不同的命令块,支持单分支、双分支和多分支结构。
基本语法
1 | # 单分支 |
流程控制是 Shell 脚本的核心功能,通过 if 和 case 语句可以实现根据不同条件执行不同命令的逻辑。本文将详细讲解这两种语句的语法、用法及注意事项。
if 语句通过判断条件的真假来执行不同的命令块,支持单分支、双分支和多分支结构。
1 | # 单分支 |
在 Linux 系统中,wc(Word Count)命令是用于统计文本文件内容的实用工具,可快速计算文件的行数、单词数、字符数和字节数。无论是处理日志文件、分析数据还是脚本编写,wc 都能提供高效的统计支持。本文将详细介绍 wc 命令的用法、选项及实战示例。
wc 命令的基本格式如下:
1 | wc [选项] 文件名/文件列表 |
若不指定文件名,wc 会从标准输入(如管道传递的数据)中读取内容并统计。
wc 命令通过不同选项实现不同维度的统计,常用选项如下:
| 选项 | 功能描述 | 说明 |
|---|---|---|
-l |
统计行数 | 以换行符(\n)为行结束标志,空行也会被计入。 |
-w |
统计单词数 | 以空格、制表符(\t)或换行符分隔的字符串视为一个单词,连续分隔符视为一个。 |
-m |
统计字符数 | 包括所有字符(字母、数字、符号、空格、换行符等),支持多字节字符(如中文)。 |
-c |
统计字节数 | 以字节为单位计数,与字符数的区别在于:单字节字符(如英文)两者相同,多字节字符(如中文)则不同(如 UTF-8 中一个中文字符占 3 字节)。 |
MySQL 主从复制是分布式数据库架构的基础,通过将主库(Master)的数据异步复制到从库(Slave),实现读写分离、负载均衡和数据备份。本文详细解析主从复制的核心原理、复制方式、配置步骤及常见架构。
主从复制依赖三个关键线程协同工作,实现数据从 Master 到 Slave 的传递与应用:
| 线程类型 | 所在节点 | 核心作用 |
|---|---|---|
| Binlog Dump Thread | Master | 监测 Master 的二进制日志(binlog)变化,当有数据更新时,将 binlog 事件发送给 Slave。 |
| I/O Thread | Slave | 连接 Master,接收 Binlog Dump Thread 发送的 binlog 事件,写入 Slave 的中继日志(relay log)。 |
| SQL Thread | Slave | 读取中继日志中的 binlog 事件,解析并执行 SQL 语句,将 Master 的数据变更应用到 Slave。 |
根据数据同步的时效性和一致性保障,主从复制分为以下三种方式:
sed(Stream Editor,流编辑器)是 Linux 中处理文本的核心工具之一,它以逐行处理的方式对数据流进行编辑(如替换、删除、新增等),且默认不修改原文件,仅输出处理结果。掌握 sed 能高效完成批量文本修改、日志分析、配置文件处理等任务。
sed 命令(规则)处理缓冲区中的行。特点:默认不修改原文件,仅输出处理结果;可通过 -i 选项直接修改原文件。
1 | sed [选项] '地址范围 动作' 输入文件 |
| 选项 | 功能说明 |
|---|---|
-n |
静默模式,仅输出被 p 动作指定的行(抑制默认输出)。 |
-e |
允许在同一行指定多个 sed 命令(多命令执行)。 |
-f 脚本文件 |
从文件中读取 sed 命令(适合复杂脚本)。 |
-r |
启用扩展正则表达式(无需转义 +、? 等元字符)。 |
-i |
直接修改原文件(危险操作,建议先备份或测试)。 |
| 动作 | 功能说明 |
|---|---|
a \文本 |
在指定行后追加文本(多行需用 \ 分隔)。 |
i \文本 |
在指定行前插入文本(多行需用 \ 分隔)。 |
c \文本 |
用指定文本替换整行(多行需用 \ 分隔)。 |
d |
删除指定行。 |
p |
打印指定行(常与 -n 配合使用)。 |
s/旧字符串/新字符串/修饰符 |
替换字符(核心动作,详见下文)。 |
w 文件名 |
将指定行写入文件。 |
sed 通过 “地址范围” 指定对哪些行执行动作,默认对所有行生效。地址可以是行号、正则表达式或两者结合。
数字(如 3 表示第 3 行)。起始行,结束行(如 2,5 表示第 2 到 5 行)。数字,$( 表示第 3 行到最后一行)。PriorityQueue 是 Java 集合框架中基于二叉堆实现的优先级队列,它能够保证每次取出的元素都是队列中优先级最高的(默认是自然排序的最小值)。与普通队列的 “先进先出” 不同,PriorityQueue 的元素顺序由优先级决定,适用于需要动态获取最值的场景(如任务调度、Top K 问题等)。
Comparable)或定制排序(传入 Comparator)。offer)和删除(poll)操作的时间复杂度为 O(log n),获取最值(peek)为 O(1)。PriorityBlockingQueue(并发版本)。null 会抛出 NullPointerException。PriorityQueue 的核心是二叉堆,它是一种满足以下性质的完全二叉树:
结构性:是一棵完全二叉树(除最后一层外,每一层都被填满;最后一层的节点靠左排列)。
堆序性:
<pre class="mermaid"> graph TD
0((0)) --- 1((1)) --- 3((3))
1((1)) --- 4((4))
0((0)) --- 2((2))</pre>
<pre class="mermaid"> graph TD
0((4)) --- 1((3)) --- 3((1))
1((3)) --- 4((0))
0((4)) --- 2((2))</pre>
完全二叉树的特性使得堆可以用数组高效存储,父子节点的索引关系如下:
2*i + 12*i + 2(i - 1) >>> 1(等价于 (i-1)/2,无符号右移避免负数问题)