返回主页 学习路径
Shell (Bash)
Linux 自动化的核心工具
Bash(Bourne Again Shell)由 Brian Fox 于 1989 年创建,是 Linux/Unix 系统的默认 Shell。Bash 脚本是系统管理员和 DevOps 工程师的日常工具——用于文件操作、进程管理、软件安装、日志分析、自动化部署等。Bash 可以轻松调用 sed、awk、grep 等文本处理工具,是真正的"胶水语言"。虽然 Bash 语法有些晦涩,但掌握基本的 Bash 脚本编写是后端和运维开发的必备技能。
运维之友 · 系统胶水
📅 诞生时间1989年 · Brian Fox (GNU)
🧩 编程范式命令式 · 脚本
📊 类型系统动态 · 弱类型(均为字符串)
⚡性能
6/10
📦生态
5/10
🧠易用
8/10
🚀并发
3/10

📑 本文目录

📌 第一部分:Shell (Bash) 概览与定位

1.1 定义与全称

Bash(Bourne Again Shell)是 GNU 项目为 Unix/Linux 系统开发的 Shell 程序,由 Brian Fox 于 1989 年创建。Bash 是大多数 Linux 发行版和 macOS 的默认 Shell,也是 系统管理员和 DevOps 工程师最核心的工具

1.2 核心定位

Bash 的核心定位是 系统自动化与进程管理。它提供了:

1.3 主要应用领域

1.4 知名案例


📜 第二部分:Shell (Bash) 的历史与发展演进

2.1 诞生背景(1989年)

Bash 由 Brian Fox 于 1989 年为 GNU 项目编写,作为 Bourne Shell(sh)的替代品。Bash 融合了 sh、csh、ksh 等多个 Shell 的优点,成为 Linux 系统默认的 Shell。

2.2 关键版本里程碑

2.3 设计哲学


⚙️ 第三部分:核心语法与语言特性

3.1 基础语法

#!/bin/bash
# 这是注释

# 变量赋值(等号两侧不能有空格)
name="World"
age=25

# 使用变量
echo "Hello, $name!"

# 命令替换
current_dir=$(pwd)
echo "Current directory: $current_dir"

# 算术运算
sum=$((10 + 20))
echo "Sum: $sum"

# 条件判断
if [ $age -gt 18 ]; then
    echo "Adult"
else
    echo "Minor"
fi

# 循环
for i in {1..5}; do
    echo "Number: $i"
done

# while 循环
count=0
while [ $count -lt 5 ]; do
    echo "Count: $count"
    count=$((count + 1))
done

# case 语句
case $name in
    "Alice")
        echo "Hello Alice!"
        ;;
    "Bob")
        echo "Hi Bob!"
        ;;
    *)
        echo "Hello stranger!"
        ;;
esac

# 函数定义
greet() {
    local name=$1
    echo "Hello, $name!"
}

greet "World"

3.2 变量与数据类型

3.3 文本处理工具

# grep - 文本搜索
grep "error" /var/log/syslog
grep -r "TODO" ./src/

# sed - 流编辑器
sed "s/old/new/g" file.txt
sed -n "10,20p" file.txt  # 打印 10-20 行

# awk - 文本处理
awk "{print $1, $3}" file.txt
awk "$1 > 100 {print $0}" data.txt
awk -F"," "{print $2}" data.csv  # 指定分隔符

# cut - 切割文本
cut -d"," -f1,3 data.csv

# sort - 排序
sort -n -k2 data.txt  # 按第二列数值排序

# uniq - 去重
sort file.txt | uniq
sort file.txt | uniq -c  # 统计出现次数

# wc - 统计
wc -l file.txt   # 行数
wc -w file.txt   # 单词数
wc -c file.txt   # 字符数

# xargs - 参数传递
ls *.txt | xargs rm -f
find . -name "*.log" | xargs grep "ERROR"

3.4 管道与重定向

# 管道 - 连接命令
ps aux | grep nginx | grep -v grep

# 输出重定向
echo "Hello" > file.txt    # 覆盖
echo "World" >> file.txt   # 追加

# 错误重定向
command 2> error.log
command 2>&1  # 错误重定向到标准输出

# 同时输出到文件和终端
command | tee output.log

# 输入重定向
sort < unsorted.txt

3.5 条件判断

# 文件判断
if [ -f file.txt ]; then
    echo "File exists"
fi

if [ -d /usr/bin ]; then
    echo "Directory exists"
fi

if [ -e /path/to/thing ]; then
    echo "Exists"
fi

# 字符串判断
if [ -z "$var" ]; then
    echo "Variable is empty"
fi

if [ -n "$var" ]; then
    echo "Variable is not empty"
fi

if [ "$name" = "Alice" ]; then
    echo "Hello Alice"
fi

# 数值判断
if [ $num -eq 10 ]; then
    echo "Equals 10"
fi

# -eq (等于)、-ne (不等于)、-gt (大于)、-lt (小于)
# -ge (大于等于)、-le (小于等于)

3.6 循环与选择

# for 循环
for file in *.txt; do
    echo "Processing $file"
done

# 数值范围
for i in {1..10}; do
    echo $i
done

# while 循环
while read line; do
    echo "$line"
done < file.txt

# until 循环(条件为假时执行)
until [ $count -ge 10 ]; do
    echo $count
    count=$((count + 1))
done

# select 菜单
select option in "Start" "Stop" "Restart"; do
    case $option in
        "Start") echo "Starting..." ;;
        "Stop") echo "Stopping..." ;;
        "Restart") echo "Restarting..." ;;
        *) break ;;
    esac
done

3.7 函数

# 定义函数
function greet() {
    local name=$1
    echo "Hello, $name!"
}

# 调用函数
greet "World"

# 函数返回值
function add() {
    return $(( $1 + $2 ))
}
add 10 20
echo "Result: $?"

# 函数输出捕获
function get_date() {
    echo "$(date)"
}
today=$(get_date)

3.8 实用脚本技巧

# 捕获信号
trap "echo Script interrupted; exit 1" INT TERM

# 执行脚本时显示调试信息
set -x  # 打开调试
set +x  # 关闭调试

# 错误时退出
set -e

# 检查命令是否存在
if command -v docker &> /dev/null; then
    echo "Docker is installed"
else
    echo "Docker is not installed"
fi

# 获取脚本所在目录
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)

# 颜色输出
echo -e "\033[31mRed text\033[0m"
echo -e "\033[32mGreen text\033[0m"
echo -e "\033[33mYellow text\033[0m"

📋 第四部分:常用场景示例

4.1 日志分析

#!/bin/bash
# 统计日志中的错误次数

ERROR_COUNT=$(grep -c "ERROR" /var/log/app.log)
WARNING_COUNT=$(grep -c "WARNING" /var/log/app.log)

echo "Errors: $ERROR_COUNT"
echo "Warnings: $WARNING_COUNT"

# 显示最近 10 条错误
grep "ERROR" /var/log/app.log | tail -10

4.2 文件备份

#!/bin/bash
# 备份指定目录

SOURCE_DIR="/home/user/data"
BACKUP_DIR="/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_$TIMESTAMP.tar.gz"

tar -czf "$BACKUP_DIR/$BACKUP_FILE" "$SOURCE_DIR"

if [ $? -eq 0 ]; then
    echo "Backup successful: $BACKUP_FILE"
else
    echo "Backup failed"
    exit 1
fi

# 删除 30 天前的备份
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +30 -delete

4.3 健康检查

#!/bin/bash
# 服务健康检查

SERVICE_NAME="nginx"

if systemctl is-active --quiet $SERVICE_NAME; then
    echo "$SERVICE_NAME is running"
else
    echo "$SERVICE_NAME is down, restarting..."
    systemctl restart $SERVICE_NAME
    echo "Restarted $SERVICE_NAME"
fi

4.4 批量处理

#!/bin/bash
# 批量重命名文件

for file in *.jpg; do
    mv "$file" "${file%.jpg}_processed.jpg"
done

# 批量替换文件内容
find . -name "*.txt" -exec sed -i "s/old_text/new_text/g" {} \;

⚖️ 第五部分:Shell 与其他工具对比

5.1 Bash vs Python(脚本编写)

5.2 Bash vs Zsh

5.3 Bash vs PowerShell


🧠 第六部分:学习建议

1
基础入门

Bash 基础命令、变量、参数、条件判断、循环

2
核心工具

grep、sed、awk、cut、sort、uniq、xargs

3
脚本实战

日志分析、文件备份、服务管理、批量处理

4
高级方向

调试技巧、性能优化、复杂脚本架构

推荐学习资源


🎯 总结升华

Bash 是 Linux 世界的"万能胶水"。

它可能不是最优雅的语言,但它是 系统管理、自动化部署、DevOps 的核心工具。任何 Linux 服务器、Docker 容器、CI/CD 流水线中,Bash 脚本都无处不在。

掌握 Bash 意味着你能 高效地管理服务器、自动化重复任务、快速处理文本数据。无论你是后端开发者、运维工程师还是 DevOps 专家,Bash 都是必备技能。

"Bash 是系统管理员的瑞士军刀。" 🔧

🔖 相关标签
#运维 #自动化 #DevOps #Linux #脚本 #系统管理 #CI/CD
📄 本文档为 Shell (Bash) 完整白皮书 · 最后更新于 2026年06月28日