Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Bash 核心概念

一句话理解 Bash:

Bash 是一个 “命令解析 + 展开 + 进程调度” 的语言型壳层(Shell)

一、Bash 在系统中的真实位置(认知基石)

用户
Bash(解析 / 展开 / 调度)
Kernel(fork / exec / IO / signal)
程序
  • Bash 不执行命令
  • Bash 决定“如何执行”
  • Bash 的核心价值在于:
    • 展开规则
    • 组合命令
    • 控制进程

写 Bash,本质是在写 进程编排逻辑

二、命令执行完整生命周期(最重要)

1. 读取输入
2. 词法分割(tokenize)
3. 展开(Expansion)
4. 重定向(Redirection)
5. fork
6. exec

⚠️ 90% Bash Bug 出现在第 3 步:展开

三、五大展开机制(按真实顺序)

Bash 的展开顺序是 固定且不可改变的

1️⃣ Brace Expansion(花括号)

{a,b,c}
file{1..3}.log
  • 最早发生
  • 不看变量、不看文件

2️⃣ Tilde Expansion(~)

~
~user

3️⃣ Parameter Expansion(变量展开)

$VAR
${VAR}

高频高级用法(生产必会)

${VAR:-default}   # 未定义 -> default
${VAR:=default}   # 未定义 -> 赋值
${VAR%/*}         # dirname
${VAR##*/}        # basename

suspend=${SUSPEND:-n} 就是 标准参数展开最佳实践

4️⃣ Command Substitution(命令替换)

$(command)

❌ 旧写法:

`command`

5️⃣ Filename Expansion(Globbing)

*.log

⚠️ 这是 Bash 行为,不是 ls 行为

ls *.log
# Bash 先展开 -> ls 接收参数

四、引号系统(Bash 的“安全带”)

1️⃣ 双引号 " "

  • 保留变量
  • 禁止分词
  • 禁止 glob
"$var"

2️⃣ 单引号 ’ '

  • 绝对字面量
  • 什么都不展开
'$var'

3️⃣ 不加引号(高危)

rm $file

等价于:

rm file1 file2 file3

Bash 安全第一原则:变量永远加引号

五、变量的真实本质(重要)

  • Bash 没有类型
  • 一切都是字符串
  • “整数比较”是语法层封装
a=10
b=2

[[ $a -gt $b ]]

六、条件判断模型(判断的是“退出码”)

1️⃣ [ ](test 命令)

[ -f file ]
  • 是命令
  • 靠参数分隔
  • 容易炸

2️⃣ [[ ]](强烈推荐)

[[ -f file ]]
[[ $a == *.log ]]
[[ $s =~ regex ]]

优点:

  • 正则
  • 无 glob
  • 语法安全

BASH_REMATCH 就是 [[ =~ ]] 的高级用法

七、流程控制 = 退出码控制

if(不是 true / false)

if command; then
    ...
fi

if 判断的是 $? == 0

for(两种模型)

for i in a b c; do
done
for ((i=0; i<10; i++)); do
done

⚠️ 不要:

for i in $(ls)

while(流式处理)

while read -r line; do
done < file

八、函数(Shell 风格)

func() {
    local var=1
    echo "$var"
}
  • 没有 return 值
  • 返回靠 stdout
  • 状态靠 exit code

九、进程模型(非常关键)

fork / exec

  • 每个外部命令都是新进程
  • 内建命令除外(cd / export)

作业控制

command &
jobs
fg
bg

十、I/O 重定向模型

文件描述符

FD 含义
0 stdin
1 stdout
2 stderr

高频写法

command > out.log 2>&1
command &>/dev/null

十一、管道(| 的真实含义)

a | b | c
  • 每个 | 都会 fork
  • 默认只返回最后一个状态
set -o pipefail

十二、变量作用域

VAR=1        # shell 变量
export VAR   # 环境变量
  • 环境变量 -> 子进程
  • shell 变量 -> 当前 shell

十三、生产脚本三件套

set -euo pipefail
选项 含义
-e 错即退
-u 未定义变量报错
pipefail 管道失败即失败

十四、进阶路径(建议)

最值得学的是:

  1. Bash 调试模型

    • set -x
    • trap ERR
    • PS4
  2. 生产级 Bash 规范

    • 不炸
    • 可维护
    • 可迁移
  3. Bash -> Go 的抽象迁移

    • 哪些逻辑该留在 Bash
    • 哪些必须上 Go