Bashでターミナルにいのちを輝かせてみた

```math
\def\textlarge#1{%
  {\rm\Large #1}
}
\def\textrm#1{%
  {\rm #1}
}
```
こんにちは、だるおです。

![jibun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450615/99aabdce-c72f-2fce-dbb5-44f0b85ec4ed.png)


突然ですが先日、２０２５年に開催される大阪・関西万博の『公式ロゴマーク』が発表されました。
<br>
<br>
その名も、


![いのちの輝きクン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450615/b0eaa779-a1b3-cc53-1857-29aa2d0c8f86.png)


<font color="Red">**「いのちの輝き君」**</font>です。
<br>
これを始めてみたときは「*うわきm...*」と「$\mathbb{Kawaii}$」の間くらいの複雑な感情になりましたが、膨大な候補の中から選出されたロゴなので大阪の一市民でしかない僕は黙って受け入れるしかありません。
<br>
<br>
......さて、そんな**<font color="blue">いのちの輝き君をなんとか見慣れてきた僕は、こう思いました。</font>**

![shutu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450615/f3b8ecba-a3d7-8163-c8a8-d932cd47a230.png)

<b><font color="Red">$\textlarge{ターミナルでいのちの輝き君をアニメーション表示させたい!}$</font></b>
<br>
そう、**「この強烈なロゴをターミナルにアニメーション表示させたい」**という気持ちがフツフツと湧いてきたのです。これが愛府心というものなのでしょうか。
<br>
**「大阪・関西万博の『公式ロゴマーク』」**という尊い使命を背負って生まれてきたこのいのちの輝き君にとって、**<font color="blue">多種多様な形で表現されることは本望</font>**に違いありません。ならば、きっと**アニメーション表示されることも望んでいる**ことでしょう!
<br>
<br>
......というわけで、さっそくbashスクリプトで書いていきたいと思います。
<br>
<br>
# bashでアニメーション表示させるには

bashでアニメーションを表現する場合、１行であればprintfの`\r`を用いたり、以下のような、`clear`を用いた<font color="blue">**ちょっと乱暴な方法**</font>もあります。

```bash
#!/bin/bash
clear

while :; do
    echo a
    sleep 0.15
    clear

    echo ab
    sleep 0.15
    clear

    echo abc
    sleep 0.15
    clear

    echo ab
    sleep 0.15
    clear

    echo a
    sleep 0.15
    clear
done
```

しかし、**今後似たようなことをしたい！となった時に、使いまわすことができたら楽**なのでANSI Escapeを用いて実装します。
<br>
決して次の方法しか知らなかった、とかではありません。
<br>
<br>
# AAの準備
アニメーションの前に、まずはAA(アスキーアート)を準備しなければいけません。
[AA変換(アスキーアート生成)](https://tool-taro.com/image_to_ascii/)
このサイトでいのちの輝き君の画像をAAに変換します。

```txt

                            ..+NMMMNa,       ..JgNNgJ.. 
                           (MMMMMMMMMMN,  .JMMMMMMCHMNJ.  
                         .dMMNMMNMMMMMMMp.MMMMNM\  .####MN, 
                         .MMNMNMMNMNMNMNMMMNMMM@   .YMB^JMNx           
                    .JgNNdMNMMNMMNMMNMMMNMMNNMMN,      .dMMN.                
                  .MMMMMMMMNMMNMNMMNMMNMMNMMMMNMMa.....MMMMN! 
                 (MMMMNMMNMMNMMNMMNMMMNMMMNMNMMNMMMMMNMMMNM#            
                .MMMNMMNMNMMMNMMNMMMM9! WMMNMNMMNMMNNMMNMMN$                   
        .gMMMMMNgMMNMMNMMNMMNM\          TMMMMMMMNMMMMNMMM$                  
      .MMBHMMMMMMNMMNMMNMMM#            (WNMNNMMNMNMMMMMMMMNNg.,  
     .MM##p  .WNMNMMNMMNMMNN@                jMMMNMNMNMNNMNMMMMMMMMm, 
     dN?MMD   ,MNMMNMMNMNMMN,               .MMMMMMMNMMMNMMNNMMNMMNMN- 
     HNe     .gMMMMNMMNMMMMNM;              .MMMNMNMMNMMMNMMMMNMMMMM#        
     ,MMNg-(gMMMNMMNMMMNMNMMM@                ?WMMMNMMNNMMNMMNMMNMB=  
      ,WMMMMMMMNMNMMNMNMNMNMMF                    dMMNMMNMMNMM^  
        .TMMNMNMMMMNMMMMMMMM@                    .MMMNMMMNMMNMb                
       .JMNMMMMMNMMMNMMNMM#=                     MMNMMNMNMMNMMM;        
      .MMMMNMMNMMNMMMNM/                        .MMNMMNMMNMMMNM]            
      dMNMMMNMMSMMRTMMMN.                       .MMMNMMNMMNMNMM\      
      MMMNMMMF d##M! WMM{                        ?MMNMMNMMNMMM@
      MNMMNMN]   ~   .MM                          ?MMNMMNMMMND               
      ,MMMMMMN,     .MNF                        .gMMMMNMMNMMe.       
       ,HMNMMMMMNggMMMMMe                    .JMMMMNMMNMMNMMMNN,        
         (TMNMMMMMMMMMMNM;                  .MMMMNMMNMMMMMMMMMMMp 
              ~?MMMNNMMMMb                 .MMMNMMNMMN@    .JWMM|          
               .NMMNMNNMM#                 JMMMNMNMMMF     d###MMb 
                MMMMMMMMNF           ..(JJ-JMMNMMMNMN|     ?MM#=MF     
                dNMNNMMMMMNMMNJ.  .MMMMMMMMMNMMNMNMMMN.        (M           
                 TNMMNMNMMMMMMMMNMMMNMNMMNMNMNMMNMMNMMNm.....(MM^
                  .THMNMNMNMNMMMMMMMNMMNMMNMMMNMMMMMMMMMMMMMMM        
                    dMMMMNMNMNNMNNMMMMMMNMMMNMMNMNMMMMMMMB  
                    JMMNMMMMMMMNMMNMNMBTHNMMNMMMN:                         
                     TNMMNNMNMMMMMMN@     ,MMMNMM#                   
                      (TMMMMNM#MMMML .+J .MMMMNM%                      
                                .WNMMadMM+MMMMM#^                           
                                  -TMMMMMNMMMB^               
                                      _?7?!
```
<font color="red">$\textlarge{Kawaii......}$</font>
<br><br>
素晴らしいですね。あのいのちの輝き君の**愛くるしさ、躍動感が損なわれず**アスキーアートに変換されています。
<br>
これをもとに、**<font color="red">目玉の部分が動いた差分</font>**も用意します。

```txt
                            ..+NMMMNa,       ..JgNNgJ.. 
                           (MMMMMMMMMMN,  .JMMMMMMCHMNJ.  
                         .dMMNMMNMMMMMMMp.MMMMNM\  .####MN, 
                         .MMNMNMMNMNMNMNMMMNMMM@   .YMB^JMNx           
                    .JgNNdMNMMNMMNMMNMMMNMMNNMMN,      .dMMN.                
                  .MMMMMMMMNMMNMNMMNMMNMMNMMMMNMMa.....MMMMN! 
                 (MMMMNMMNMMNMMNMMNMMMNMMMNMNMMNMMMMMNMMMNM#            
                .MMMNMMNMNMMMNMMNMMMM9! WMMNMNMMNMMNNMMNMMN$                   
        .gMMMMMNgMMNMMNMMNMMNM\          TMMMMMMMNMMMMNMMM$                  
      .MMBHMMMMMMNMMNMMNMMM#            (WNMNNMMNMNMMMMMMMMNNg.,  
     .MM##p  .WNMNMMNMMNMMNN@                jMMMNMNMNMNNMNMMMMMMMMm, 
     dN?MMD   ,MNMMNMMNMNMMN,               .MMMMMMMNMMMNMMNNMMNMMNMN- 
     HNe     .gMMMMNMMNMMMMNM;              .MMMNMNMMNMMMNMMMMNMMMMM#        
     ,MMNg-(gMMMNMMNMMMNMNMMM@                ?WMMMNMMNNMMNMMNMMNMB=  
      ,WMMMMMMMNMNMMNMNMNMNMMF                    dMMNMMNMMNMM^  
        .TMMNMNMMMMNMMMMMMMM@                    .MMMNMMMNMMNMb                
       .JMNMMMMMNMMMNMMNMM#=                     MMNMMNMNMMNMMM;        
      .MMMMNMMNMMNMMMNM/                        .MMNMMNMMNMMMNM]            
      dMNMMMNMMSMMRTMMMN.                       .MMMNMMNMMNMNMM\      
      MMMNMMMF d##M! WMM{                        ?MMNMMNMMNMMM@
      MNMMNMN]   ~   .MM                          ?MMNMMNMMMND               
      ,MMMMMMN,     .MNF                        .gMMMMNMMNMMe.       
       ,HMNMMMMMNggMMMMMe                    .JMMMMNMMNMMNMMMNN,        
         (TMNMMMMMMMMMMNM;                  .MMMMNMMNMMMMMMMMMMMp 
              ~?MMMNNMMMMb                 .MMMNMMNMMN@    .JWMM|          
               .NMMNMNNMM#                 JMMMNMNMMMF     d###MMb 
                MMMMMMMMNF           ..(JJ-JMMNMMMNMN|     ?MM#=MF     
                dNMNNMMMMMNMMNJ.  .MMMMMMMMMNMMNMNMMMN.        (M           
                 TNMMNMNMMMMMMMMNMMMNMNMMNMNMNMMNMMNMMNm.....(MM^
                  .THMNMNMNMNMMMMMMMNMMNMMNMMMNMMMMMMMMMMMMMMM        
                    dMMMMNMNMNNMNNMMMMMMNMMMNMMNMNMMMMMMMB  
                    JMMNMMMMMMMNMMNMNMBTHNMMNMMMN:                         
                     TNMMNNMNMMMMMMN@  MJ+,MMMNMM#                   
                      (TMMMMNM#MMMML      MMMMNM%                      
                                .WNMM    +MMMMM#^                           
                                  -TMMMMMNMMMB^               
                                      _?7?!
```
<font color="red">$\textlarge{Yeah......}$</font>
<br>
いかがでしょう、目を**きょろっと別の方向**に向かせました。想像通りのキュートさです。
<br><br>
この調子であと何種類か用意しましょう。私は<font color="blue">**合計5種類**</font>用意しました。


# コード実装

```bash
#!/bin/bash
# いのちの輝き君AA定義
INOCHINOKAGAYAKI="(最初に生成した、いのちの輝き君のAA)"
INOCHINOKAGAYAKING_0="(いのちの輝き君の差分AA)"
INOCHINOKAGAYAKING_1="(いのちの輝き君の差分AA)"
INOCHINOKAGAYAKING_2="(いのちの輝き君の差分AA)"
INOCHINOKAGAYAKING_3="(いのちの輝き君の差分AA)"
INOCHINOKAGAYAKING_4="(いのちの輝き君の差分AA)"

# 最初の出力
echo -e "$INOCHINOKAGAYAKI"
sleep 1
# 行数取得
LINE=$(echo -e "${INOCHINOKAGAYAKI}"|wc -l)
# NUMに最小値代入
NUM=0

# NUMが5になるまで繰り返し
until [ ${NUM} -eq 5 ];do
    # 取得した行数分、画面を初期化
    for i in $(seq 1 ${LINE});do
        echo $'\e[1A' $'\e[1G' $'\e[2K' $'\e[1A'
    done # どね
    # INOCHINOKAGAYAKING_番号を表示
    eval echo \"\${INOCHINOKAGAYAKING_${NUM}}\"
    sleep 0.15
    # 行数取得
    LINE=$(eval echo -e \"\${INOCHINOKAGAYAKING_${NUM}}\"|wc -l)
    # 次の番号にインクリメント
    NUM=$((${NUM} + 1))
done #どね
```
基本的にuntilで回数分ループさせる構造に、必要行数分を画面初期化したのち表示させるといった処理をさせています。
<br><br>
はじめに表示させるアスキーアートの変数名は「いのちの輝き君」から、**<font color="red">「INOCHINOKAGAYAKI」と名付けた</font>**のですが、**SEKAI NO OWARI**みたいでほっこりした気持ちになりました。
<br>
アニメーション差分のアスキーアートの変数は、英語で動作を表す`ing`をつけて、**<font color="red">「INOCHINOKAGAYAKING」と名付けた</font>**のですが、**<font color="blue">あまりにも躍動感があふれていたため、作業デスクから逃げ出したい</font>**気持ちになりました。

# <font color=#ff0000">完成!Bashいのちの輝き君アニメーション!!</font>

![inochi.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450615/baafeeae-c4cd-2670-c986-44085e0ecd8b.gif)

<font color="red">$\textlarge{SUPER　BEAUTIFUL......}$</font>
<br>
いかがでしょう。このキョロキョロした目の玉の動き方はまさに**大阪・関西万博の象徴**。そしてそのうごめく姿は愛くるしく、こちらに**何か語りかけているようにも見えます。**

![スクリーンショット 2020-08-28 2.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450615/2485d7c4-d21e-82c1-8791-53eaaa0b5833.png)
<br>
深夜この記事の確認作業で、突然画面に大きくこのGifが表示されたときは**<font color="red">思わず叫んでしまいました。</font>**
<br>
......さあ、いかがでしたでしょうか?
<br><br>
今回は頑張って**Bashを用いてターミナルにいのちの輝き君をアニメーション表示**させたわけですが、これによって得した人間は誰一人いないという奇跡のようなQiita記事でしたね。
<br><br>
もし記事を読んでいるMac勢の方がいらっしゃいましたら、是非とも暇つぶしにしてみてはいかがでしょうか。せめて誰かの役に立ちたいので。
<br><br>
![me.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450615/78589ecd-f5d0-1e37-d35c-4c82d8d643ea.png)

<br><br>
以上、だるおがお送りしました。
<br><br><br><br>
それではさようなら。