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-ignore | EditorConfig の ignore 規則を常に適用 | shfmt --apply-ignore -l . (Debian Manpages) |
| `-ln, –language-dialect bash | posix | mksh |
-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-indent | case の各パターンをインデント | 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"
標準入力を整形(フィルタとして使用)
説明:エディタ/パイプラインからの入力をそのまま整形。
コマンド
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
関連コマンド
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)

コメント