A shell parser, formatter, and interpreter. Supports POSIX Shell, Bash, and mksh. Requires Go 1.17 or later.
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 mvdan.cc/sh/v3/cmd/shfmt@latest
shfmt
formats shell programs. See canonical.sh for a
quick look at its default style. For example:
shfmt -l -w script.sh
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, FreeBSD, Homebrew, MacPorts, NixOS, Scoop, Snapcraft, Void and webi.
go install mvdan.cc/sh/v3/cmd/gosh@latest
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, which requires Go 1.18 or later. For instance:
cd syntax
go test -run=- -fuzz=ParsePrint
$ 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 ))
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.
To build a Docker image, checkout a specific version of the repository and run:
docker build -t my:tag -f cmd/shfmt/Dockerfile .
This creates an image that only includes shfmt. Alternatively, if you want an
image that includes alpine, add --target alpine
.
To use the Docker image, run:
docker run --rm -u "$(id -u):$(id -g)" -v "$PWD:/mnt" -w /mnt my:tag <shfmt arguments>
The following editor integrations wrap shfmt
:
shell script
pluginOther noteworthy integrations include:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。