piapia123
zh

Shell 脚本格式化

格式化

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

把一段没有缩进的 Shell 脚本排整齐:if / fi、for / done、while / do、case / esac、函数体与子 shell 都会按层级对齐,case 的分支标签比 case 深一级、;; 回到分支层级。这个工具给自己划的界线是「只改每行开头的空白」—— 行内的一个字符都不碰。Shell 不是可以随便重排的语言:`<<EOF` 之后的内容逐字是数据,多一个空格就改了它;续行与引号里的换行都依赖原来的位置。代价是它不会把 `if [ x ]; then echo ok; fi` 展开成三行,但也不会把你的脚本弄坏。

功能

  • 按结构缩进:if / for / while / case / 函数体 / 子 shell
  • case 分支单独处理:分支标签深一级,;; 回到分支层级
  • 只改行首空白,行内一个字符都不动
  • heredoc(<<EOF)之间逐字保留 —— 缩进会改变那里的数据
  • 跨行字符串内部不动,注释里的引号也不会被误当成字符串开始
  • 收尾词后跟重定向(done < file)也能正确对齐
  • 缩进宽度可选 2 或 4,可选去行尾空白、可选压空行

使用方法

  1. 把脚本粘进输入框
  2. 缩进实时整理好
  3. 按需要调整缩进宽度与两个空白选项
  4. 复制结果

常见问题

为什么不提供「压缩」功能?
因为在 Shell 里那是个陷阱。注释可能落在 heredoc 里(那时它是数据,去掉就改了内容),行尾没有换行的脚本被压成一行会直接改变意思,`&&` 与管道的换行位置也不是随便能动的。多数脚本确实压不坏,但坏掉的那部分不会报错、只会在运行时表现怪异 —— 所以这个工具不做它。
heredoc 为什么原样保留?
因为 `<<EOF` 到 `EOF` 之间的每一行都是被写入的数据,那里的缩进是内容的一部分。给它加缩进,就等于改了脚本输出的内容 —— 比如生成一份 YAML 或一段代码时,缩进错了整份文件就错了。`<<-` 形式允许前导制表符,但只允许制表符,这个区别也保留了。
会改变脚本的行为吗?
不会。工具只重写每行开头的空白,而且会先识别出 heredoc 与跨行字符串并跳过它们。行内内容(包括多余的空格、特殊字符、注释)都原样保留。
脚本会上传吗?
不会。格式化全在浏览器里完成,页面不发送任何请求 —— 部署脚本里常常有密钥与内部地址,它们不会离开这台设备。

相关工具