6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

クソアプリAdvent Calendar 2024

Day 17

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

Posted at

こんちは

塩ハム(d)です

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

前回12/17の記事としてこちらを書きました

image.png
image.png

作りました(血涙)

unicuteコマンド

エスケープシーケンスで動かしてほしいとのことなので、こちらのページを参考にして書いてみました

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

こちらがその1つです

UNI_0="
       \   うにです  /
          ̄ ̄ ̄∨ ̄ ̄ ̄

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

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

UNICUTE="

                   うにだね
                      かわいいね"

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

せっかくなのでね

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

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

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

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の変数を求めるための定義を書いて、最後にカーソルを所定の位置に移動します

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の変数を更新し、ループ閉じ

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

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

#!/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のファイルがあるところで行って下さい

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

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

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

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?