shfmt – シェルスクリプトを自動整形するフォーマッタ

コード索引・ナビゲーション

shfmt は POSIX sh / bash / mksh / bats 向けのコードフォーマッタです。インデントやスペース、改行位置などを一定のスタイルに整え、差分チェックや自動修正に使えます。EditorConfig による設定や、方言(ダイアレクト)の明示も可能です。 (Debian Manpages)
実務では、CIでの整形チェック(-d/-lローカルでの一括整形(-w、**スタイルの統一(-i -ci -bn など)**に活用します。 (Debian Manpages)

構文(Syntax)

# 基本
shfmt [flags] [path...]

# 代表例
shfmt -l -w .              # 差分が出るファイルを表示しつつ、上書き整形
shfmt -d .                 # 整形差分を表示(CI向け、非0で終了)
shfmt -i 2 -ci -bn script.sh   # インデントや改行位置を好みに調整
shfmt -p -ln=posix file.sh      # POSIX方言として解析(-p は -ln=posix の短縮)
shfmt -f .                 # ディレクトリ配下のシェルスクリプトを再帰列挙
  • 引数が - または無指定なら 標準入力を整形します。ディレクトリを渡すと内部で再帰探索されます。 (FreeBSD マニュアルページ)

主なオプション一覧

オプション説明使用例
-l, --list整形差分が出るファイルだけを一覧表示shfmt -l . (Debian Manpages)
-w, --write整形結果で上書きshfmt -w script.sh (Debian Manpages)
-d, --diff整形差分を表示し、差分があれば非0で終了shfmt -d . (Debian Manpages)
-s, --simplify可能な箇所を簡素化(冗長表現の整理)shfmt -s . (Debian Manpages)
-mn, --minify縮小(サイズ削減、-s を内包)shfmt -mn file.sh (Debian Manpages)
--apply-ignoreEditorConfig の ignore 規則を常に適用shfmt --apply-ignore -l . (Debian Manpages)
`-ln, –language-dialect bashposixmksh
-p, --posix-ln=posix の短縮shfmt -p file.sh (Debian Manpages)
-filename NAME標準入力整形時の仮想ファイル名`cat x
-i, --indent Nインデント幅(0=タブ、>0=スペース数)shfmt -i 2 file.sh (Debian Manpages)
-bn, --binary-next-line&&/`
-ci, --case-indentcase の各パターンをインデントshfmt -ci file.sh (Debian Manpages)
-sr, --space-redirects> 2>&1 等のリダイレクト直後に空白shfmt -sr file.sh (Debian Manpages)
-kp, --keep-padding桁揃え用のスペース配置を保持shfmt -kp table.sh (Debian Manpages)
-fn, --func-next-line関数の {次行に置くshfmt -fn file.sh (Debian Manpages)
-f, --findディレクトリ配下の対象ファイルを列挙shfmt -f . (Debian Manpages)
--to-json / --from-json構文木を型付きJSONとして出力/入力shfmt --to-json file.sh (Debian Manpages)
-versionバージョン表示shfmt -version (ManKier)

実行例

スタイルを決めて一括整形(上書き)

説明:Google Shell Style に近い設定(2スペース・case インデント・二項演算子改行)でプロジェクトを上書き整形。
コマンド

shfmt -i 2 -ci -bn -l -w .

出力例:整形対象ファイルのパスが列挙される(実体は上書き)。 (Debian Manpages)

CIで差分のみ表示して失敗させる

説明:フォーマット崩れがあれば PR を不合格にするパターン。
コマンド

shfmt -d .
echo $?   # 差分があると非0

出力例(例)

--- a/script.sh
+++ b/script.sh
@@
-echo $var
+echo "$var"

(Debian Manpages)

標準入力を整形(フィルタとして使用)

説明:エディタ/パイプラインからの入力をそのまま整形。
コマンド

echo 'for i in $*;do echo $i;done' | shfmt

出力例

for i in "$@"; do
	echo "$i"
done

(典型的なスタイルへの変換) (FreeBSD マニュアルページ)

POSIX方言での構文チェック代替

説明bash -n より網羅的に構文エラーを検出できる例。
コマンド

echo 'foo=(1 2)' | shfmt -p >/dev/null
echo $?

出力例(例)

1

(POSIXでは配列構文は不正として検出) (Debian Manpages)

エラー例:POSIX指定でBash専用構文を含む

説明-p(POSIX)で Bash 配列を含むとエラーになります。
コマンド

echo 'foo=(1 2)' | shfmt -p

出力例(例)

1:5: arrays are a bash feature

(Debian Manpages)

関連コマンド

  • shellcheck:シェルスクリプトの静的解析(バグ・非推奨検出)。整形と併用が定番。
  • bats:Bash スクリプトの単体テストランナー(TAP/JUnit)。
  • bash -n:構文チェック(shfmt -p と目的が近いが網羅性は異なる)。
  • editorconfig:プロジェクト単位のスタイル定義。shfmt は EditorConfig を読み取れます。 (Debian Manpages)

備考

  • EditorConfig 連携.editorconfig が見つかると整形オプションを適用しますが、パーサ/プリンタ系のフラグ(例:-i)を明示すると EditorConfig は無効化されます。必要なら既定値を明示(例:-i=0)して ignore を有効化できます。 (Debian Manpages)
  • ダイアレクト検出:拡張子・shebang から自動検出できない場合は bash を既定として扱います。.sh は特例で posix 扱い(shebang が上書き)。 (Debian Manpages)
  • 出力と終了コード-d は差分があるだけで**エラー扱い(非0)**にして CI で落とす用途に便利。色付けは端末検出と NO_COLOR/FORCE_COLOR 等で制御可能。 (Debian Manpages)
  • 入出力の応用--to-json/--from-json で抽象構文木をやり取り可能。ツール連携やコード変換実験に使えます。 (Debian Manpages)
  • 入手:各ディストリ/パッケージ(例:Homebrew brew install shfmt、Snap 等)や go install mvdan.cc/sh/v3/cmd/shfmt@latest で導入。 (Homebrew Formulae)

参考

  • Debian manページ:shfmt(1)(フラグ、EditorConfig連携、方言・プリンタ設定、例) (Debian Manpages)
  • Ubuntu manページ:shfmt(1)(EditorConfig の適用仕様・オプション) (manpages.ubuntu.com)
  • Mankier:shfmt(1)(オプション一覧の要約) (ManKier)
  • GitHub: mvdan/sh(プロジェクト・README) (GitHub)
  • Homebrew Formula(配布情報) (Homebrew Formulae)
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント