一、Shell / Bash 快速 Cheat Sheet(速查手册)
以下摘自 Devhints、LinuxConfig 和 Red Hat 的优秀 Bash cheat sheet 集合:
- Devhints – Bash Scripting Cheatsheet (Devhints.io cheatsheets)
- LinuxConfig Bash Scripting Cheat Sheet (Linux Config)
- Red Hat Bash Cheat Sheet (Red Hat Developer)
常用语法 & 概念速览
主题 | 语法 / 示例 | 说明 | |
---|---|---|---|
Shebang | #!/bin/bash 或 #!/usr/bin/env bash |
指定脚本解释器 | |
注释 | # 这是注释 |
行内注释,不执行 | |
执行权限 | chmod +x script.sh |
使脚本可执行 | |
变量 | name="Alice" ;${name} 或 $name |
赋值与引用(等号两侧不能有空格) | |
参数 | $0 (脚本名)、$1 、$2 、$# (参数个数) |
访问传入脚本的命令行参数 | |
条件判断 | bash if [[ condition ]]; then … elif … else … fi |
也可用 test … 或 [ ] |
|
字符串比较 | == , != , < , > (在 [[ ]] 中) |
注意空格与引号 | |
整数比较 | -eq , -ne , -lt , -gt , -le , -ge |
例如 if [[ $a -gt $b ]]; then … fi |
|
循环 | for var in list; do … done ;while condition; do … done |
常用于遍历、重复执行 | |
函数 | bash my_func() { commands; } |
内部可用 return 或 echo 输出 |
|
命令替换 | `command` 或 $(command) |
把命令输出作为值 | |
重定向 / 管道 | > 、>> 、< 、2> ,管道符 ` |
` | 控制输入、输出、错误流 |
数组 | arr=(a b c) ;${arr[0]} ;${#arr[@]} |
Bash 支持一维数组 | |
错误处理 | set -e 、set -u 、trap '…' EXIT ERR |
写更健壮的脚本 | |
执行状态 | $? |
上一个命令的退出码(0 成功,非 0 失败) | |
流程控制 | break , continue |
用在循环中跳出或继续下一个迭代 | |
流程替换 | <(...) 、>(...) |
高级用法,生成匿名文件描述符 |
Tips
- 写脚本时常用
bash -n script.sh
检查语法错误。- 用
shellcheck script.sh
静态分析潜在错误或风格缺陷。- 多阅读开源脚本,看别人的写法与风格。
二、两个练习题 + 解题思路
下面是两个适合练手的小练习题。做完后你可以与同类 Bash / Shell 脚本对比、改进。
练习题 1:统计当前目录下 .txt
文件个数
题目
写一个脚本 count_txt.sh
,统计当前目录里后缀为 .txt
的文件数量,并打印结果。
要求
- 使用
find
或通配符方式实现。 - 输出形式:
There are N .txt files in the current directory.
- 如果没有
.txt
文件,输出0
。
解题思路 / 提示
-
find . -maxdepth 1 -type f -name "*.txt"
找同目录下 txt 文件。 -
| wc -l
得到数量。 -
或使用
for file in *.txt; do …; done
,注意当没有.txt
时*.txt
会被字面展开为*.txt
,要加判断。 -
示例解法(极简):
#!/bin/bash count=$(find . -maxdepth 1 -type f -name "*.txt" | wc -l) echo "There are $count .txt files in the current directory."
练习题 2:安全删除脚本 safe_rm.sh
题目
写一个脚本 safe_rm.sh
,实现一个“安全删除”的功能:
- 接受 一个 参数
file_path
。 - 检查参数个数:如果不是正好一个参数,提示用法并退出(退出码非 0)。
- 如果文件或目录存在,将其移动(或复制)到一个名为
recycle_bin
的目录(在当前目录下,如果不存在就创建)。 - 然后删除原位置(即从当前目录中移除它)。
- 输出移动操作与删除操作的信息。
要求
- 脚本要对文件 / 目录皆适用。
- 保证不覆盖 recycle_bin 中已有同名文件(可重命名或添加时间戳后缀)。
- 删除操作要小心,避免误删。
解题思路 / 提示
-
利用
$#
检查参数个数。 -
用
mkdir -p recycle_bin
创建 recycle 目录(若不存在)。 -
用
basename
得到文件名。 -
检查目标是否已存在,若存在可用
date +%s
或mv file recycle_bin/"$name_$(date)".
-
使用
mv
或cp
+rm
。 -
示例骨架:
#!/bin/bash if [[ $# -ne 1 ]]; thenecho "Usage: $0 <file_or_dir>"exit 1 fitarget="$1" recycle="recycle_bin" mkdir -p "$recycle"if [[ ! -e "$target" ]]; thenecho "$target: no such file or directory"exit 1 finame=$(basename "$target") dest="$recycle/$name" if [[ -e "$dest" ]]; thendest="${recycle}/${name}_$(date +%s)" fimv "$target" "$dest" echo "Moved $target -> $dest" exit 0
你可以在这个骨架上加复杂功能(如保留目录结构、软链接处理等)。
三、额外练习 / 练习资源链接
- w3resource Bash 脚本练习(含题目 & 参考答案)(w3resource)
- Exercism Bash Track:提供很多练习、自动评测与社区反馈 (Exercism)
- 高级 Bash 练习题(适合进阶)(Innolitics)
- Rutgers 大学 Shell 脚本练习:从基础到中级题目都有 (Linux Course)
- Duke 大学 UNIX Shell 练习与答案 (people.duke.edu)