---
title: "ANSI Escape Code 備忘録"
draft: false
publish: 2025-12-26
update: 2026-01-22
description: "ANSI Escape Code の使い方をまとめた備忘録"
tags: ["CLI", "Bash"]
---

## なにこれ？

ANSI Escape Code についての備忘録。

## ANSI Escape Code ってなに？

ANSI Escape Code とは、ターミナルの表示を制御するための一連の文字列のこと。
`\n` を出力ストリームに渡すことで改行が行われるように、特定のエスケープシーケンスを出力ストリームに渡すことでより複雑なことができます。
例えば以下のことが制御可能。

- 文字の装飾：色（文字色・背景色）の変更、スタイル（太字・斜体・下線など）の適用
- カーソル操作：自由な位置への移動、現在位置の保存・復元
- 画面制御：画面や行のクリア、代替バッファ（別画面）への切り替え、カーソルの非表示

ANSI Escape Code は多くのターミナルエミュレータでサポートされていて、
開発言語や環境差をそこまで気にしなくていいのがメリット。（一部の環境では動作しない制御コマンドもある）

## 基本フォーマット

ANSI Escape Code は、まず以下のいずれかを **接頭辞（エスケープ文字）** として記述するのが基本です。

| 種類       | 表記     | 補足                                               |
| :--------- | :------- | :------------------------------------------------- |
| 8進数      | `\033`   |                                                    |
| 10進数     | `27`     | ASCIIコード                                        |
| 16進数     | `\x1b`   |                                                    |
| Unicode    | `\u001b` |                                                    |
| エスケープ | `\e`     | 非推奨。言語・コンパイラによって動作保証が異なる。 |

多くの制御コマンドは、この接頭辞の直後に `[`（開き角括弧）を付けます。このセットを CSI (Control Code Introducer) と呼び、この後ろに引数（数値）を `;` 区切りで記述し、最後に「何をさせるか」を決める英字（コマンド）を置いて完結させます。

```bash
# フォーマット： \033[ (引数1);(引数2) (コマンド)

# 例1： \033[3;32m
# 3 = 斜体、32 = 緑、m = 文字属性変更コマンド
# 例2： \033[0m
# 0 = リセット、m = 文字属性変更コマンド
printf '\033[3;32m Hello ANSI \033[0m'
```

## テキスト装飾（SGR）

最もよく使われるのが、文字の色やスタイルを変更する SGR (Select Graphic Rendition) パラメータ。 `ESC[` と `m` の間に数値を指定して実行します。

### スタイル指定

| コード                | 説明                     | 備考                                 |
| :-------------------- | :----------------------- | :----------------------------------- |
| `ESC[0m`              | スタイルと色を初期化     | `ESC[m` と同等                       |
| `ESC[1m`              | 太字                     | フォントが対応していれば適用         |
| `ESC[2m`              | 薄字                     | フォントが対応していれば適用         |
| `ESC[3m`              | 斜体                     | フォントが対応していれば適用         |
| `ESC[4m`              | 下線                     |                                      |
| `ESC[5m`              | 点滅（低速）             | 私の環境では動作しなかった           |
| `ESC[6m`              | 点滅（高速）             | 私の環境では動作しなかった           |
| `ESC[7m`              | 文字色と背景色を反転     |                                      |
| `ESC[8m`              | 文字を非表示             | 選択してコピペすることは可能         |
| `ESC[9m`              | 取り消し線               |                                      |
| `ESC[10m`             | デフォルトフォントに設定 | 私の環境では動作しなかった           |
| `ESC[11m` ~ `ESC[19m` | 代替フォントの選択       | 私の環境では動作しなかった           |
| `ESC[20m`             | フラクツール (Fraktur)   | 私の環境では動作しなかった           |
| `ESC[21m`             | 二重下線                 | 環境によっては太字オフとして動作する |
| `ESC[22m`             | 太字・薄字を解除         | 1 と 2 の指定をオフにする            |
| `ESC[23m`             | 斜体・フラクツールを解除 | 3 と 20 の指定をオフにする           |
| `ESC[24m`             | 下線を解除               | 4 と 21 の指定をオフにする           |
| `ESC[25m`             | 点滅を解除               | 5 と 6 の指定をオフにする            |
| `ESC[26m`             | 比例間隔                 | 私の環境では動作しなかった           |
| `ESC[27m`             | 反転を解除               | 7 の指定をオフにする                 |
| `ESC[28m`             | 非表示を解除             | 8 の指定をオフにする                 |
| `ESC[29m`             | 取り消し線を解除         | 9 の指定をオフにする                 |

![alt](./style-example.png)

:::toggle[スタイルサンプル]

```bash
printf '\033[1mBold\033[22m          -> Reset\n'
printf '\033[2mThin\033[22m          -> Reset\n'
printf '\033[3mItalic\033[23m        -> Reset\n'
printf '\033[4mUnderLine\033[24m     -> Reset\n'
printf '\033[7mInvert\033[27m        -> Reset\n'
printf '\033[8mHide\033[28m          -> Reset\n'
printf '\033[9mStrikethrough\033[29m -> Reset\n'
```

:::

### 色指定

| コード                                                  | 説明                                    | 備考                             |
| :------------------------------------------------------ | :-------------------------------------- | :------------------------------- |
| `ESC[30m` ~ `ESC[37m`                                   | 文字色を30~37で指定                     | 番号と色の対応は以下の画像の通り |
| <code>ESC[38;2;<em>r</em>;<em>g</em>;<em>b</em>m</code> | 文字色をRGB（0~255）で指定              |                                  |
| <code>ESC[38;5;<em>id</em>m</code>                      | 文字色を0~255のカラーインデックスで指定 |                                  |
| `ESC[39m`                                               | 文字色をデフォルトに戻す                |                                  |
| `ESC[40m` ~ `ESC[47m`                                   | 背景色を40~47で指定                     | 番号と色の対応は以下の画像の通り |
| <code>ESC[48;2;<em>r</em>;<em>g</em>;<em>b</em>m</code> | 背景色をRGB（0~255）で指定              |                                  |
| <code>ESC[48;5;<em>id</em>m</code>                      | 背景色を0~255のカラーインデックスで指定 |                                  |
| `ESC[49m`                                               | 背景色をデフォルトに戻す                |                                  |

![alt](./color-8-example.png)

:::toggle[カラー（0~7）サンプル]

```bash
COLORS=("Black" "Red" "Green" "Yellow" "Blue" "Magenta" "Cyan" "White")

for ((i=0; i<${#COLORS[@]}; i++))
do
    fg="3${i}"
    printf "\033[${fg}m%-10s\033[39m " "${fg}:${COLORS[$i]}"
    bg="4${i}"
    printf "\033[${bg}m%-10s\033[49m\n" "${bg}:${COLORS[$i]}"
done
```

:::

![alt](./color-rgb-example.png)

:::toggle[カラー（RGB）サンプル]

```bash
for i in {0..15}; do
    for j in {0..31}; do
        r=$((i * 16))
        g=$((j * 8))
        printf "\033[38;2;%d;%d;255m@" "$r" "$g"
    done
    printf "\033[39m\n"
done

printf "\n"

for i in {0..15}; do
    for j in {0..31}; do
        r=$((i * 16))
        g=$((j * 8))
        printf "\033[48;2;%d;%d;255m@" "$r" "$g"
    done
    printf "\033[49m\n"
done
```

:::

![alt](./color-id-example.png)

:::toggle[カラー（ID）サンプル]

```bash
for i in {0..15}; do
    for j in {0..15}; do
        fg=$(((i * 16) + j))
        printf "\033[38;5;${fg}m%02x\033[39m " "${fg}"
    done
    printf "\n"
done

printf "\n"

for i in {0..15}; do
    for j in {0..15}; do
        bg=$(((i * 16) + j))
        printf "\033[48;5;${bg}m%02x\033[49m " "${bg}"
    done
    printf "\n"
done
```

:::

## 画面削除

| コード   | 説明             | 備考 |
| :------- | :--------------- | :--- |
| `ESC[2J` | 画面全体をクリア |      |

## カーソル制御

### 移動

| コード                                  | 説明                                                                     | 備考                   |
| :-------------------------------------- | :----------------------------------------------------------------------- | :--------------------- |
| <code>ESC[<em>n</em>A</code>            | カーソルを <code><em>n</em></code> 行上に移動                            |                        |
| <code>ESC[<em>n</em>B</code>            | カーソルを <code><em>n</em></code> 行下に移動                            |                        |
| <code>ESC[<em>n</em>C</code>            | カーソルを <code><em>n</em></code> 桁右に移動                            |                        |
| <code>ESC[<em>n</em>D</code>            | カーソルを <code><em>n</em></code> 桁左に移動                            |                        |
| <code>ESC[<em>n</em>E</code>            | カーソルを <code><em>n</em></code> 行下の先頭に移動                      |                        |
| <code>ESC[<em>n</em>F</code>            | カーソルを <code><em>n</em></code> 行上の先頭に移動                      |                        |
| <code>ESC[<em>n</em>G</code>            | カーソルを現在の行の <code><em>n</em></code> 列目に移動                  |                        |
| <code>ESC[<em>y</em>;<em>x</em>H</code> | カーソルを <code><em>y</em></code> 行 <code><em>x</em></code> 列目に移動 | 1 から始まることに留意 |

### 形状

| コード    | 説明                                    | 備考 |
| :-------- | :-------------------------------------- | :--- |
| `ESC[0 q` | カーソルをデフォルトに変更              |      |
| `ESC[1 q` | カーソルを点滅するブロック `█` に変更   |      |
| `ESC[2 q` | カーソルを点滅しないブロック `█` に変更 |      |
| `ESC[3 q` | カーソルを点滅する下線 `＿` に変更      |      |
| `ESC[4 q` | カーソルを点滅しない下線 `＿` に変更    |      |
| `ESC[5 q` | カーソルを点滅する縦線 `｜` に変更      |      |
| `ESC[6 q` | カーソルを点滅しない縦線 `｜` に変更    |      |

### 参考

https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797

https://ja.wikipedia.org/wiki/ANSI%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%82%B3%E3%83%BC%E3%83%89
