シェルスクリプト作成の環境構築-2024年6月現在-

## はじめに

Bash+Visual Studio Codeを使用した現時点での環境構築になります。 
環境構築関連は時間の経過によって変化激しいためできるだけ最新のものを見たほうが良いです。  

## Linter -shellcheck-

https://www.shellcheck.net/

### インストール

```bash
# Ubuntu 22.04
sudo apt install shellcheck

# CentOS Stream 9
dnf config-manager --set-enabled crb
dnf install epel-release epel-next-release
dnf install ShellCheck
```

※CentOS系は"ShellCheck"という名前になっている  

### 使い方

```bash
$ shellcheck xxx.sh
In xxx.sh line 51:
        echo $comma_str
             ^--------^ SC2086 (info): Double quote to prevent globbing and word splitting.

Did you mean:
        echo "$comma_str"
```

により標準出力で問題点や文法の間違いを指摘してくれる。

## Formatter -shfmt-

https://github.com/patrickvane/shfmt

go言語で作成

### インストール

```bash
# Ubuntu 22.04
sudo apt install shfmt
```

※ CentOS Steam 9はないので公式サイトかバイナリをダウンロード後、`shfmt`にリネームして、`/usr/local/bin/shfmt`か`/usr/bin/shfmt`に格納。

https://github.com/patrickvane/shfmt/releases/tag/master

### 使い方

```bash
shfmt xxx.sh
```

により標準出力で成形されたShellScriptが出力される。

## Formatter -EditorConfig-

フォーマットのうち

- 文字コード(UTF-8等)
- 改行コード
- インデント(tab,space)
- インデントの数(2,4等)
- 改行コード前の空白を削除

を統一的に行うもの。  
Visual Studio Code等のテキストエディタと組み合わせて使う。全体的に設定するといった感じではなくプロジェクトごとに使用する感じ。    

詳細はこちら

https://qiita.com/yama-github/items/f4af3b3a0c00306bbb17

### 作成例

```:.editorconfig
root = true

[*.sh]
indent_style = tab
indent_size = 4
```

## IDE -Bash Language Server- 

https://github.com/bash-lsp/bash-language-server

テキストエディタをIDEとして実行できるようにしたもの。  
Visual Studio Code等のテキストエディタと組み合わせて使う。  
Visual Studio Codeでは`Bash IDE`で組み込まれている。

## Debugger　-bashdb-

https://bashdb.sourceforge.net/

使い方はこちら

https://hana-shin.hatenablog.com/entry/2023/04/09/215204

## 解読 -explainshell.com-

https://explainshell.com

難解なコマンドラインを解説してくれるサイト

## Visual Studio Code拡張機能

- Bash IDE
- ShellCheck
- shell-format
- Bash Debug
- Shebang Snippets
- shellman
- EditorConfg for VS Code

### Bash IDE

https://marketplace.visualstudio.com/items?itemName=mads-hartmann.bash-ide-vscode

`Bash Language Server`と`explainshell`と`shellcheck`が組み合わさったもの。`Bash Language Server`については拡張機能に組み込まれているのでインストールは不要。`shellcheck`は外部コマンドを利用するのでインストールが必要。  

コード補完、外部コマンドをホバーするとmanから読み取った使い方を表示してくれるなどがある。  

`shellcheck`を使わない設定にする場合は以下のようにする。  

```json:.vscode/settings.json
{
    "bashIde.shellcheckPath": "",
}
```

### ShellCheck

https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck

`shellcheck`を利用した拡張機能。
外部コマンド`shellcheck`を利用するのでインストールが必要。`Bash IDE`と被るので上記の設定にするかこの拡張機能を外すかのどちらかにする。

文法が間違っている、良くない書き方の場合はお知らせしてくれる。

表示したくない項目は以下のように全体適用かコマンド適用のどちらかを利用する。

例えば[SC2164](https://www.shellcheck.net/wiki/SC2164)を外したい場合は以下のようにコメントアウトか設定で

```bash
# shellcheck disable=SC2164
script_dir=$(cd "$(dirname "$0")"; pwd)
```

```json:.vscode/settings.json
{
    "shellcheck.exclude": ["2164"]
}
```

### shell-format

https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format

`shfmt`を利用した拡張機能。  
外部コマンド`shfmt`を利用するのでインストールが必要。  
`ctrl`+`shift`+`f`(formatのf)によりフォーマットされる。  

以下のようにshfmtの場所を指定する必要がある。 
加えてEditorConfigと連携する場合は以下のようにする。  

```json:.vscode/settings.json
{
    "shellformat.path": "/usr/bin/shfmt",
    "shellformat.useEditorConfig": true,
}
```

### Bash Debug

https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug

`bashdb`をGUI操作で可能にした拡張機能。  
`bashdb`は組み込まれているのでインストール不要。  

```json:.vscode/launch.json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "bashdb",
            "request": "launch",
            "name": "Bash-Debug (simplest configuration)",
            "program": "${file}",
            "args": []
        }
    ]
}
```

必要ならカレントディレクトリや引数を設定して実行する。  

### EditorConfg for VS Code

https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig

EditorConfgを利用する場合。  

ディレクトリにこれを入れて

```:.editorconfig
root = true

[*.sh]
indent_style = tab
indent_size = 4
```

`ctrl`+`shift`+`f`をするとフォーマットされる。