うにが歩くAAをアニメーションで表示するコマンドを作った

こんちは

塩ハム(d)です

みすてむずアドベントカレンダー2024 12/17の記事です

https://adventar.org/calendars/10269

前回12/17の記事として[こちら](https://qiita.com/shio_hamu_d/items/97dd0d62cd1515afda9e "動かないうにのAA")を書きました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668804/4518bcef-39f2-9cc4-bdae-bb3a5790ccb6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668804/8e67a53a-ef69-c087-a4b2-6060de495c8f.png)

作りました(血涙)

# unicuteコマンド

エスケープシーケンスで動かしてほしいとのことなので、[こちらのページ](https://orebibou.com/ja/home/201810/20181011_001/ "bashやzshなどのターミナル上で動作するアニメーションの作り方")を参考にして書いてみました

まずはアニメーションさせるために、変数にうにのAAを書いていきます

こちらがその1つです

```bash
UNI_0="
       ＼   うにです  ／
         ￣￣￣∨￣￣￣

         ＼\\||| ||/／
        =三((   ))≡=
         ／/|| |||\\＼"
```

それとは別にうにをほめたたえる変数も書きます

```bash
UNICUTE="

                   うにだね
                      かわいいね"
```

また、せっかくなので背景を青、文字色を白にして太字にします

せっかくなのでね

```bash
# 太字 文字:白 背景:青
echo -e "\e[1m \e[37m \e[44m"
echo -e "$UNI_0"
echo -e "$UNICUTE"
sleep 1.5
```

そうするとctrl+Cとかでキャンセルしたときに色が戻りません

さっきの処理の上にtrapコマンドを挿入しましょう

```bash
fix_window() {
  trap 1 2 3 4 5 15 20
  echo -e "\e[3B"
  echo -e "\e[0m"
  exit 0
}

trap 'fix_window' 1 2 3 4 5 15 20
```

そしたら変数LINEにAAのライン数を求める処理、SUFFIXとNUMにAAの変数を求めるための定義を書いて、最後にカーソルを所定の位置に移動します

```bash
LINE=$(echo -e "${UNI_1}"|wc -l)
SUFFIX="UNI_"
NUM=1

echo $'\e[5A'
```

あとはループ処理です

一気に書いていきます

COUNTを5回に設定し、0回になるまでループします

次にfor文でうにのAAを消去する処理を書きます

そうしたらevalコマンドでAAの変数を結合して表示、0.5秒待機

LINEとNUMの変数を更新し、ループ閉じ

```bash
do
    for i in $(seq 1 ${LINE});do
        echo $'\e[1A' $'\e[1G' $'\e[2K' $'\e[1A'
    done

    eval echo -e \"\${${SUFFIX}${NUM}}\"
    sleep 0.5

    LINE=$(eval echo -e \"\${${SUFFIX}${NUM}}\"|wc -l)
    NUM=$((${NUM} + 1))

    if [ $NUM -gt 8 ]; then
        NUM=1
        COUNT=$((${COUNT} - 1))
    fi

done
```

最後にエスケープシーケンスとtrapコマンドで元に戻してコマンド終了です

![WindowsTerminal_IfqwAfwvJ5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668804/71213240-bc4f-a196-92a0-daf857e7a31a.gif)

全コードがこちらになります

```bash
#!/bin/bash

# loop count
COUNT=5

UNI_0="
       ＼   うにです  ／
         ￣￣￣∨￣￣￣

         ＼\\||| ||/／
        =三((   ))≡=
         ／/|| |||\\＼"


UNI_1="
     ＼  通りますよ ／
       ￣￣￣∨￣￣￣

        ＼＼\\\\\\ |//／
       =三((   ))≡=
        ／//| \\\\\\＼＼   ((("

UNI_2="
    ＼  通りますよ ／
      ￣￣￣∨￣￣￣

       ＼\\||| ||/／
      =三((   ))≡=
       ／/|| |||\\＼   ((("


UNI_3="
   ＼  通りますよ ／
     ￣￣￣∨￣￣￣

      ＼＼\\\\\\ |//／
     =三((   ))≡=
      ／//| \\\\\\＼＼   ((("

UNI_4="
  ＼     !!!     ／
    ￣￣￣∨￣￣￣

     ＼\\||| ||/／
    =三((   ))≡=
     ／/|| |||\\＼"


UNI_5="
   ＼  戻りますよ ／
     ￣￣￣∨￣￣￣

      ＼\\\\| ///／／
     =三((   ))≡=
)))   ／／/// |\\\\＼"

UNI_6="
    ＼  戻りますよ ／
      ￣￣￣∨￣￣￣

       ＼\\|| |||/／
      =三((   ))≡=
 )))   ／/||| ||\\＼"

UNI_7="
     ＼  戻りますよ ／
       ￣￣￣∨￣￣￣

        ＼\\\\| ///／／
       =三((   ))≡=
  )))   ／／/// |\\\\＼"

UNI_8="
       ＼やっぱいいや ／
        ￣￣￣∨￣￣￣

         ＼\\|| |||/／
        =三((   ))≡=
         ／/||| ||\\＼";

UNICUTE="

                   うにだね
                      かわいいね"

fix_window() {
  trap 1 2 3 4 5 15 20
  echo -e "\e[3B"
  echo -e "\e[0m"
  exit 0
}

trap 'fix_window' 1 2 3 4 5 15 20

# 太字 文字:白 背景:青
echo -e "\e[1m \e[37m \e[44m"
echo -e "$UNI_0"
echo -e "$UNICUTE"
sleep 1.5

LINE=$(echo -e "${UNI_1}"|wc -l)
SUFFIX="UNI_"
NUM=1

echo $'\e[5A'

until [ ${COUNT} -eq 0 ]
do
    for i in $(seq 1 ${LINE});do
        echo $'\e[1A' $'\e[1G' $'\e[2K' $'\e[1A'
    done

    eval echo -e \"\${${SUFFIX}${NUM}}\"
    sleep 0.5

    LINE=$(eval echo -e \"\${${SUFFIX}${NUM}}\"|wc -l)
    NUM=$((${NUM} + 1))

    if [ $NUM -gt 8 ]; then
        NUM=1
        COUNT=$((${COUNT} - 1))
    fi

done

echo -e "\e[3B \e[0m"
trap 1 2 3 4 5 15

```

# 感想

一番上の`#!/bin/bash`(シバンっていうんですね)を`#!/bin/sh`にしてたせいでシンタックスエラーが出てるのがなかなか解決できずに詰まってました

皆さん、bashで指定したほうがいいです、おすすめです

というわけでこれにて完成とさせていただきます、お疲れさまでした

# あ、そういえば

ついでにコマンドとして設定する方法を書いておきますね

カレントディレクトリはunicuteのファイルがあるところで行って下さい

```console
cp unicute /usr/local/bin/unicute
chmod 777 /usr/local/bin/unicute
```

これでコマンド`unicute`が使えます

以上で本当におしまいです