为什么值得学 Shell
Shell 是 Linux 上最直接的自动化工具。它不需要编译,写完就能跑;能把 grep、awk、sed、find 等命令串成流水线;也适合做部署、备份、日志清理这类重复任务。掌握 Shell 的关键不是背语法,而是理解“命令 + 组合 + 控制流”这套思路。
脚本的基本结构
一个可执行的 Shell 脚本通常以 shebang 开头:
!/usr/bin/env bash
set -euo pipefail
set -euo pipefail 是实用习惯:命令失败即退出、未定义变量报错、管道中任一环节失败都能被发现。保存为 .sh 后,用 chmod +x 赋权即可运行。
变量与引号
Shell 变量赋值等号两边不能有空格:
name=”backup”
dir=”/var/log”
echo “${dir}/${name}.tar.gz”
引号规则值得记牢:双引号允许变量展开,单引号保持字面量;"$var" 能避免空格和通配符带来的意外分词。处理路径、文件名时,给变量加双引号几乎是默认动作。
条件判断与测试
if 配合 test 或 [ ] 做判断:
if [ -f “$file” ]; then
echo “存在”
elif [ -d “$file” ]; then
echo “是目录”
fi
常用测试包括 -f 文件、-d 目录、-z 空字符串、-n 非空。数值比较用 -eq、-lt,字符串比较用 =、!=。需要正则匹配时用 [[ ]] 和 =~。
循环与命令组合
遍历文件用 for,按行读取用 while read:
while IFS= read -r line; do
echo “$line”
done < list.txt
IFS= 和 -r 能保留行首尾空白与反斜杠。命令替换用 $(...),管道用 |,逻辑组合用 && 与 ||。把 find ... -print0 与 xargs -0 搭配,可安全处理含空格的文件名。
函数与参数
函数让脚本可读性更好:
log() { echo “[$(date +%F’ ‘%T)] $*”; }
log “开始备份”
脚本参数用 $1、$2、$#、$@ 获取;"$@" 加引号能正确传递带空格的参数。退出码用 exit N 返回,便于被其他脚本或调度系统判断。
实践建议
先用 bash -n 做语法检查,再用 shellcheck 找常见陷阱;调试时加 set -x 观察执行过程。重要脚本先在测试环境跑通,并把 rm、mv 等破坏性操作加上确认或日志。养成写注释、统一日志格式、失败可重试的习惯,脚本才真正可维护。