【Shell】shfmt ~ 入門編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2024/03/26/143803

で、シェルスクリプトの lint ツール「ShellCheck」の調査の過程で
「shfmt」ってのが、見つかったのでメモ。

目次

【1】shfmt
【2】インストール
【3】実行例
 1)Options
【4】Hello World
 1)コマンド例
 2)補足解説

【1】shfmt

* シェルスクリプトの Formatter ツール 

https://github.com/patrickvane/shfmt

【2】インストール

* 以下に記載されている

https://webinstall.dev/shfmt/

Windows

# powershell で以下を実行
curl.exe https://webi.ms/shfmt | powershell

# 確認
shfmt --version
v3.8.0

Linux

curl -sS https://webi.sh/shfmt | sh
# or
sudo apt  install shfmt

# 確認
shfmt --version

【3】実行例

shfmt -i 2 -w test.sh

1)Options

Options Explanations
-i [Number] インデント数(i=indent)を指定。デフォルトは「indent: 0 for tabs」
-w 上書き指定(w=Write?)
-d 差分をエラー表示
-ln [Shell] シェルの指定(bash/posix/mksh/bats, default "bash")
* 上記以外の詳細は、「shfmt -h」又は「man shfmt」でみた方が良さそう

【4】Hello World

* 以下のシェルを掛けてみる
* なお、以下のシェルは、以下の関連記事の「ShellCheck」で修正したもの。

https://dk521123.hatenablog.com/entry/2024/03/26/143803

【フォーマッタ前】test.sh

#!/bin/bash

if command -v sqlfmt
then
  echo "Found sqlfmt"
  which sqlfmt
  sqlfmt --version
else
  echo "sqlfmt is not supported in your env..."
fi

1)コマンド例

# 比較するためにバックアップ
cp test.sh test_ori.sh

# 実行
shfmt -i 2 -w test.sh

# 比較
diff test_ori.sh test.sh
3,4c3
< if command -v sqlfmt
< then
---
> if command -v sqlfmt; then

2)補足解説

* 上記の diff でみた通り、「修正前」「修正後」と
 if 文の書き方が変わった
* なお、前述したが「ShellCheck」では通過しているものだったので
 コード統一を図るためにも「ShellCheck」「shfmt」両方使った方が良さそう

修正前

if command -v sqlfmt
then

修正後

if command -v sqlfmt; then

参考文献

https://yossi-note.com/introduction-to-bash-formatting-with-shfmt/

 関連記事

シェル ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2014/10/23/005406
ShellCheck ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/03/26/143803