Use when configuring shfmt for shell script formatting including .shfmt.toml setup, EditorConfig integration, and project-specific settings.
Limited to specific tools
Additional assets for this skill
This skill is limited to using the following tools:
name: shfmt-configuration description: Use when configuring shfmt for shell script formatting including .shfmt.toml setup, EditorConfig integration, and project-specific settings. allowed-tools:
Master shfmt configuration for consistent shell script formatting across projects, including configuration files, EditorConfig integration, and team standardization.
shfmt is a shell parser, formatter, and interpreter that supports POSIX Shell, Bash, and mksh. Configuration allows you to define consistent formatting rules for your shell scripts.
shfmt supports multiple configuration approaches, in order of precedence:
.shfmt.toml or shfmt.toml fileCreate .shfmt.toml or shfmt.toml in your project root:
# Shell dialect (posix, bash, mksh, bats)
shell = "bash"
# Indent with spaces (0 for tabs)
indent = 2
# Binary operators at start of line
binary-next-line = true
# Switch cases indented
switch-case-indent = true
# Redirect operators followed by space
space-redirects = false
# Keep column alignment paddings
keep-padding = false
# Function opening brace on next line
func-next-line = false
Specifies the shell dialect for parsing:
# POSIX-compliant shell (most portable)
shell = "posix"
# Bash (default for .bash files)
shell = "bash"
# MirBSD Korn Shell
shell = "mksh"
# Bats (Bash Automated Testing System)
shell = "bats"
Auto-detection based on shebang if not specified:
#!/bin/sh -> posix#!/bin/bash or #!/usr/bin/env bash -> bash#!/bin/mksh -> mkshControls indentation style:
# 2 spaces (common)
indent = 2
# 4 spaces
indent = 4
# Tabs (use 0)
indent = 0
Controls binary operator positioning:
# Operators at end of line (default)
binary-next-line = false
# Result:
if [ "$a" = "foo" ] &&
[ "$b" = "bar" ]; then
echo "match"
fi
# Operators at start of next line
binary-next-line = true
# Result:
if [ "$a" = "foo" ] \
&& [ "$b" = "bar" ]; then
echo "match"
fi
Controls case statement indentation:
# Cases at same level as switch (default)
switch-case-indent = false
# Result:
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
esac
# Cases indented inside switch
switch-case-indent = true
# Result:
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
esac
Controls spacing around redirections:
# No space before redirect (default)
space-redirects = false
# Result:
echo "hello" >file.txt
cat <input.txt
# Space before redirect
space-redirects = true
# Result:
echo "hello" > file.txt
cat < input.txt
Preserves alignment padding:
# Remove extra alignment spaces (default)
keep-padding = false
# Input with alignment:
short="value"
longer_var="another"
# Result (alignment removed):
short="value"
longer_var="another"
# Preserve alignment
keep-padding = true
# Result (alignment kept):
short= "value"
longer_var="another"
Controls function brace placement:
# Opening brace on same line (default)
func-next-line = false
# Result:
my_function() {
echo "hello"
}
# Opening brace on next line
func-next-line = true
# Result:
my_function()
{
echo "hello"
}
shfmt respects EditorConfig settings. Create or update .editorconfig:
# EditorConfig is awesome: https://EditorConfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.sh]
indent_style = space
indent_size = 2
# shfmt-specific options
shell_variant = bash
binary_next_line = true
switch_case_indent = true
space_redirects = false
keep_padding = false
function_next_line = false
| shfmt flag | EditorConfig key |
|---|---|
-i | indent_size (0 for tabs) |
-ln | shell_variant |
-bn | binary_next_line |
-ci | switch_case_indent |
-sr | space_redirects |
-kp | keep_padding |
-fn | function_next_line |
# Format file in place
shfmt -w script.sh
# Show diff of changes
shfmt -d script.sh
# List files that need formatting
shfmt -l .
# Format and output to stdout
shfmt script.sh
# Set indent to 4 spaces
shfmt -i 4 script.sh
# Use tabs for indentation
shfmt -i 0 script.sh
# Specify shell dialect
shfmt -ln bash script.sh
# Binary operators on next line
shfmt -bn script.sh
# Indent switch cases
shfmt -ci script.sh
# Space after redirects
shfmt -sr script.sh
# Preserve padding
shfmt -kp script.sh
# Function brace on next line
shfmt -fn script.sh
# Common configuration
shfmt -i 2 -ci -bn -w script.sh
# .shfmt.toml
shell = "bash"
indent = 2
# .shfmt.toml
shell = "posix"
indent = 4
binary-next-line = false
switch-case-indent = false
# .shfmt.toml
shell = "bash"
indent = 2
binary-next-line = true
switch-case-indent = true
space-redirects = false
func-next-line = false
# .shfmt.toml - enforce team standards
shell = "bash"
indent = 2
binary-next-line = true
switch-case-indent = true
keep-padding = false
name: Shell Format Check
on: [push, pull_request]
jobs:
shfmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install shfmt
run: |
curl -sS https://webinstall.dev/shfmt | bash
export PATH="$HOME/.local/bin:$PATH"
- name: Check formatting
run: shfmt -d .
# .pre-commit-config.yaml
repos:
- repo: https://github.com/scop/pre-commit-shfmt
rev: v3.8.0-1
hooks:
- id: shfmt
args: ["-w"]
.PHONY: fmt-check fmt
fmt-check:
shfmt -d .
fmt:
shfmt -w .
.shfmt.toml for team consistencyshell to match your script shebangsshfmt -d in CI to catch formatting issuesCheck precedence order:
.shfmt.toml in project rootVerify shebang matches configuration:
# If using shell = "bash", ensure scripts have:
#!/usr/bin/env bash
# or
#!/bin/bash
Ensure EditorConfig file is in parent directory chain and has correct section:
[*.sh]
shell_variant = bash