开发者工具 · 命令速查

Bash/Shell 速查

变量/流程/循环/函数

✓本地处理 · 不上传 ✓免费 · 无需登录 ✓无次数限制 累计 113 次使用
Bash / Shell · Cheatsheet
语 法 分 类变量 · 字符串 · 数组 · 条件 · 循环 · 函数 · 特殊变量 · 输入输出 · 算术 · 其它
语 法 全 表Gallery · 点卡片看语法 / 说明 / 场景 / 示例
点选左侧任一语法
查看 语法 / 中文说明 / 典型场景 · 示例代码块 · 相关项
脚 本 骨 架Skeletons · 高频脚本片段速查(点代码块整段复制)
就绪 · 含分类速查 + 语法 + 中文说明 + 典型场景 + 示例 + 易错陷阱朱砂警示 · 全程浏览器本地
第一节

关于本工具

About

写脚本时,记不清 `-le` 和 `-eq` 到底哪个是小于等于,或者 `for` 循环里 `{1..10}` 和 `seq 1 10` 的区别——每次都要翻 man 页或搜博客。这个速查表把变量、流程控制、循环、函数这四类最频繁的语法,按场景列出等价写法与常见坑点,比如 `[ ]` 与 `[[ ]]` 的变量展开差异。所有内容直接渲染在页面上,不依赖后端,打开即用。

使用场景

壹

日志文件按天拆分

服务器日志每天凌晨滚一次,运维小陈手动执行 `mv access.log access-$(date +%Y%m%d).log && kill -USR1 $(cat /var/run/nginx.pid)` 已经半年了。上周忘了加日期变量,旧日志被覆盖,老板要查三天前的访问记录,翻了一天备份才找到。用本工具写完拆分脚本,把 `date` 命令和 `kill` 信号封装成函数,每天定时任务自动执行,再也没丢过日志。

贰

批量重命名图片序列

摄影师老赵从相机导出 500 张 RAW 文件,文件名全是 `_DSC1234.NEF` 这种相机默认编号。甲方要求按「项目名_日期_序号」格式提交,手动改到凌晨两点,第 43 张和第 44 张文件名写反了,被甲方退回重做。用本工具写一个 for 循环,配合 `printf` 补零和 `mv` 命令,三秒钟跑完所有文件重命名,命名规则固化在脚本里,下次直接改项目名变量就行。

叁

服务器批量创建用户

新入职 12 个实习生,运维主管老李要逐个跑 `useradd -m -s /bin/bash zhangsan` 再设密码。第 8 个人时敲错用户名,系统提示已存在,又得回头查谁占用了。用本工具写一个循环,从 CSV 文件读取用户名和初始密码,`while read` 逐行执行 `useradd` 和 `echo $pass | passwd --stdin`,跑完检查 `/etc/passwd` 确认 12 人全在,省了半小时重复劳动,还不会漏人。

肆

监控进程异常退出

线上 Java 服务每隔三天凌晨四点半挂一次,开发组长张工每天醒来先看报警群。手动 `ps aux | grep java` 查进程,但挂掉那瞬间日志被重启脚本覆盖,查了半个月没找到根因。用本工具写一个 while 循环加 `sleep` 间隔,每分钟检查 `pgrep java` 的返回值,进程消失时立即用 `date` 和 `strace` 记录现场,跑了三天就抓到是 OOM 触发 `systemd` 强制杀进程。

伍

备份脚本按日期归档

数据库每周全量备份,DBA 小王手动执行 `mysqldump > backup.sql` 后上传到 NAS。上周五备份文件被第二天的增量覆盖,恢复时发现全量备份只有 3KB,原来是 `mysqldump` 执行失败但脚本没有报错退出。用本工具写一个函数封装备份逻辑:先检查 `mysqldump` 退出码,非零则发钉钉告警;再用 `date` 变量生成带时间戳的文件名,最后用 `rsync` 同步到异地,每次备份都留一份独立副本。

第二节

使用指南

Getting Started

使用步骤

  1. 1在左侧代码区输入 Bash 脚本(如 `for i in {1..5}; do echo $i; done`),右侧实时高亮语法并显示执行结果
  2. 2点击「变量」标签展开变量定义示例,双击任意变量名(如 `$HOME`)自动插入到代码区光标位置
  3. 3在「流程控制」面板选择 `if`、`case` 或 `while` 模板,点击后代码区追加对应结构并自动缩进
  4. 4点击「运行」按钮,结果区输出脚本标准输出与错误流,错误行标红并附带行号
  5. 5点击「复制代码」将当前代码区内容写入剪贴板,或点「清空」重置输入

输入输出示例

输入输出说明
for i in 1 2 3; do echo $i; done1 2 3常规:基础 for 循环遍历列表,验证变量展开与换行输出
x=5; if [ $x -gt 3 ]; then echo 'yes'; else echo 'no'; fiyes常规:条件判断(数值比较),验证 if-else 结构与 test 命令
a=; echo ${a:-default}default边界:空变量使用默认值语法,验证参数展开的边界行为
for i in {1..100000}; do :; done(无输出,但工具应正常结束)边界:大范围循环,验证工具能否处理大量迭代而不超时或崩溃
echo 'hello world' | tr 'a-z' 'A-Z'HELLO WORLD常规:管道与文本转换,验证管道操作符和 tr 命令
x=10; while [ $x -gt 0 ]; do echo $x; x=$((x-1)); done10 9 8 7 6 5 4 3 2 1易错:while 循环中变量递减,验证算术展开与条件递减,常见漏写递减导致死循环
my_func() { echo $1; }; my_func 'arg1'arg1易错:函数定义与参数传递,验证函数作用域和位置参数,新手常忘函数定义语法
x=1; if [ "$x" = 1 ]; then echo 'match'; fimatch易错:字符串比较时变量未加双引号,验证引号对空格或空值的保护作用

常见错误对照

1.变量赋值等号两边有空格

✗ 错误name = "John"
✓ 修复name="John"

Bash 中赋值操作符 = 两侧不能有空格,否则会被解释为命令 name 带参数 = 和 "John",导致 command not found。

2.if 条件中空格缺失导致语法错误

✗ 错误if ["$x" -eq 1]
✓ 修复if [ "$x" -eq 1 ]

[ 是 test 命令的别名,左右必须各留一个空格;条件表达式内部操作符前后也要空格,否则 Bash 会解析为单个字符串。

3.for 循环中变量引用漏了 $ 符号

✗ 错误for i in "$@"; do echo i; done
✓ 修复for i in "$@"; do echo "$i"; done

循环体内使用变量必须加 $ 前缀,否则 Bash 会把 i 当作字面字符串输出,而不是变量值。

4.函数内用 return 返回字符串而非数字

✗ 错误myfunc() { return "hello"; }
✓ 修复myfunc() { echo "hello"; }

Bash 函数 return 只能返回 0-255 的整数退出码,不能返回字符串。要返回字符串应使用 echo 输出,调用方用 $(...) 捕获。

5.双引号内变量展开被忽略

✗ 错误echo "$HOME"
✓ 修复echo "$HOME"

双引号内变量 $HOME 正常展开,但若写成单引号 '\$HOME' 则不会展开。核心是:双引号保留变量展开,单引号完全字面。

6.算术运算误用圆括号而非双括号

✗ 错误result=(1 + 2)
✓ 修复result=$((1 + 2))

Bash 算术运算必须用 $(( ... )) 语法,单圆括号 ( ... ) 是子 shell 执行,不会做数学计算,且空格处理不同。

7.管道中变量修改不生效

✗ 错误count=0; echo -e 'a\nb' | while read line; do ((count++)); done; echo $count
✓ 修复count=0; while read line; do ((count++)); done < <(echo -e 'a\nb'); echo $count

管道右侧的 while 在子 shell 中运行,修改的变量 count 在父 shell 不可见。使用进程替换 < <(...) 避免子 shell 问题。

第三节

工作原理

How It Works

核心公式

exit_code = 0 if command succeeds, else 1–255

变量说明

  • exit_code命令退出状态码,0 成功,非 0 失败
  • command执行的 Bash 命令或脚本语句

示例

执行 `ls /nonexistent` 后,`echo $?` 输出 2(文件不存在),表示命令失败;若 `ls /tmp` 成功,`$?` 为 0。

输入脚本/命令词法分析(拆解为 token)语法解析(构建 AST)执行引擎(变量/循环/函数)输出结果错误反馈错误时回退
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
问这个速查表里有没有 if-else 的例子?我老是记不住 elif 的写法。+
答

有。在「流程控制」区块下直接列出了 if-then-elif-else-fi 的标准骨架,并附带一个判断文件是否存在的完整示例。elif 后要跟 then,且整个结构必须以 fi 结尾——这是初学者最容易漏掉的地方。如果你需要多层嵌套,速查表里也给出了 case 语句的模板,比多层 if 更清晰。

问循环里 for i in 和 for ((i=0;;i++)) 有什么区别?+
答

两种写法对应不同场景。for i in list 遍历的是已存在的列表(如文件列表、参数列表),每次循环 i 自动取下一个值,适合处理已知集合。for ((初始化;条件;步进)) 是 C 风格循环,适合需要计数或复杂终止条件的场景,例如遍历数组索引。速查表里分别给出了「遍历当前目录所有 .sh 文件」和「从 1 循环到 10」的两种典型示例,可直接复制修改。

问变量赋值为什么等号两边不能有空格?我老是报错 command not found。+
答

Shell 语法里等号两边不能有空格,因为 name = value 会被解析成执行命令 name 并传两个参数 = 和 value。正确写法是 name=value,变量名、等号、值紧贴。速查表在「变量」区块开头用红字标注了这个规则,并给出了正确的赋值示例和错误对比。如果变量值本身包含空格,必须用引号包裹,如 name="hello world"。

问速查表里有没有函数怎么定义和传参的例子?+
答

有。在「函数」区块里给出了两种定义方式(function name {} 和 name() {}),并演示了如何用 $1、$2 获取参数,用 $@ 获取全部参数。还包含一个计算两数之和并返回结果的实际例子。特别标注了函数内部用 local 声明局部变量避免污染全局,以及 return 只返回退出码(0-255),如果需要返回字符串应使用 echo 捕获。

问为什么我的脚本里用 source 加载另一个脚本,变量却拿不到?+
答

source 会在当前 Shell 进程执行目标脚本,正常情况下变量应该可用。拿不到通常是三个原因之一:目标脚本里变量没 export(子进程才需要 export,但 source 是当前进程,export 不是必须的,除非你后面还要调用子进程);目标脚本路径写错了(用相对路径时当前工作目录不是你想象的那个);目标脚本里变量定义在函数或条件分支内部,执行流程没走到那一行。速查表在「变量作用域」示例中演示了 source 的行为。

问这个速查表能离线用吗?我有时候在没网的服务器上写脚本。+
答

可以。这个页面是纯前端实现(FE),所有内容在首次加载后即缓存在浏览器中。只要打开过一次,后续即使断网也能正常浏览速查表内容。不需要联网加载任何外部资源。如果需要更完整的离线方案,建议将此页面保存为 PDF 或使用浏览器的「保存网页」功能,或者直接复制速查表里的代码模板到本地文件。

问速查表里有没有处理字符串截取和替换的方法?+
答

有。在「变量」区块的「字符串操作」子项中,列出了 ${var:offset:length} 截取、${var#pattern} 和 ${var%pattern} 去头去尾、${var/old/new} 替换等常用语法。每个都附带了具体例子,比如从文件路径中提取文件名(${path##*/})和扩展名(${path##*.})。这些是 Bash 特有的参数扩展,比用 sed 或 cut 更高效,适合在脚本中直接使用。

问速查表里有没有数组操作的例子?我想遍历一个列表。+
答

有。在「变量」区块的「数组」部分,演示了如何声明数组(arr=(a b c))、获取单个元素(${arr[0]})、获取所有元素(${arr[@]})以及获取数组长度(${#arr[@]})。同时给出了用 for i in "${arr[@]}" 遍历数组的完整代码块。特别说明:数组索引从 0 开始,且 Bash 4.0+ 支持关联数组(declare -A),速查表底部有版本差异提示。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

↑↓选择 ↵打开 ⌘+↵新窗口 esc关闭