A shell parser, formatter, and interpreter with bash support; includes shfmt
Alternatives To Sh
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Sh5,891829 days ago155May 23, 202286bsd-3-clauseGo
A shell parser, formatter, and interpreter with bash support; includes shfmt
Google Java Format4,9497791a month ago17March 07, 2022107otherJava
Reformats Java source code to comply with Google Java Style.
Prettier Eslint3,7734,6343,2593 days ago98May 26, 20223mitJavaScript
Code :arrow_right: prettier :arrow_right: eslint --fix :arrow_right: Formatted Code :sparkles:
22 days ago116apache-2.0Vim Script
Vim configuration for Rust.
Textlint2,5833951422 days ago197September 20, 202251mitTypeScript
The pluggable natural language linter for text and markdown.
Dprint1,925124 days ago89June 29, 202252mitRust
Pluggable and configurable code formatting platform written in Rust.
a month ago122bsd-2-clauseVim Script
:sparkles: A (Neo)vim plugin for formatting code.
Plugin Php1,60350303 days ago48July 02, 202291mitPHP
Prettier PHP Plugin
Bbuncrustifyplugin Xcode1,208
4 years agoMarch 24, 20166mitObjective-C
Xcode plugin to format source code using ClangFormat or Uncrustify
Advanced Tables Obsidian1,085
6 months ago51gpl-3.0TypeScript
Improved table navigation, formatting, and manipulation in
Alternatives To Sh
Select To Compare

Alternative Project Comparisons


Go Reference

A shell parser, formatter, and interpreter. Supports POSIX Shell, Bash, and mksh. Requires Go 1.19 or later.

Quick start

To parse shell scripts, inspect them, and print them out, see the syntax examples.

For high-level operations like performing shell expansions on strings, see the shell examples.


go install[email protected]

shfmt formats shell programs. See for a quick look at its default style. For example:

shfmt -l -w

For more information, see its manpage, which can be viewed directly as Markdown or rendered with scdoc.

Packages are available on Alpine, Arch, Debian, Docker, Fedora, FreeBSD, Homebrew, MacPorts, NixOS, Scoop, Snapcraft, Void and webi.


go install[email protected]

Proof of concept shell that uses interp. Note that it's not meant to replace a POSIX shell at the moment, and its options are intentionally minimalistic.


We use Go's native fuzzing support. For instance:

cd syntax
go test -run=- -fuzz=ParsePrint


  • When indexing Bash associative arrays, always use quotes. The static parser will otherwise have to assume that the index is an arithmetic expression.
$ echo '${array[spaced string]}' | shfmt
1:16: not a valid arithmetic operator: string
$ echo '${array[dash-string]}' | shfmt
${array[dash - string]}
  • $(( and (( ambiguity is not supported. Backtracking would complicate the parser and make streaming support via io.Reader impossible. The POSIX spec recommends to space the operands if $( ( is meant.
$ echo '$((foo); (bar))' | shfmt
1:1: reached ) without matching $(( with ))
  • Some builtins like export and let are parsed as keywords. This allows statically building their syntax tree, as opposed to keeping the arguments as a slice of words. It is also required to support declare foo=(bar). Note that this means expansions like declare {a,b}=c are not supported.


A subset of the Go packages are available as an npm package called mvdan-sh. See the _js directory for more information.


All release tags are published via Docker, such as v3.5.1. The latest stable release is currently published as v3, and the latest development version as latest. The images only include shfmt; -alpine variants exist on Alpine Linux.

To build a Docker image, run:

docker build -t my:tag -f cmd/shfmt/Dockerfile .

To use a Docker image, run:

docker run --rm -u "$(id -u):$(id -g)" -v "$PWD:/mnt" -w /mnt my:tag <shfmt arguments>

Related projects

The following editor integrations wrap shfmt:

Other noteworthy integrations include:

Popular Formatter Projects
Popular Plugin Projects
Popular Text Processing Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.