# Shell/Bash 速查

## 管道与重定向

竖线把前一个命令的标准输出交给后一个；大于号覆盖写、双大于号追加，只收错误用文件描述符二，把错误并回标准输出用二大于与一，tee 能同时显示和写入文件。

```bash
grep -n "err" app.log | wc -l
```

## 常用命令

文件查找、磁盘占用、进程与归档是日常高频操作，按人类可读容量排序用 sort 的短横 h 参数，按天数筛旧文件用 find 的修改时间参数。打包时记得排除输出文件自身。

```bash
find . -name "*.log" -mtime +7
```

## awk / sed / grep

grep 找行、sed 改文本、awk 按列统计，三者常串成一条流水线；awk 用短横 F 指定分隔符，美元一表示第一列，END 块在所有行处理完后执行，适合做求和与计数。

```bash
awk -F',' '{s += $3} END {print s}' f
```

## 变量与条件

赋值等号两侧不加空格，美元加小括号取命令输出，双方括号做判断，引用变量一律加双引号避免空格被拆成多个词。判断文件是否存在用短横 f，目录用短横 d，比较前先确认变量非空。

```bash
if [[ -f "$f" ]]; then echo ok; fi
```

## 循环与函数

for 遍历文件列表，while read 逐行处理；函数内用 local 限制变量作用域，失败时返回一让调用方能判断。通配没匹配到文件时会原样留下星号，循环开头先判存在再处理，别对星号动手。

```bash
for f in *.log; do echo "$f"; done
```

## 脚本模板

开头固定几行：指定解释器、报错即退出、未定义变量报错、管道失败可感知，能挡住大部分低级故障。参数个数先校验，路径一律加引号，错误信息写到标准错误流，别和正常输出混在一起。

```bash
#!/usr/bin/env bash
set -euo pipefail
```
