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


\def\textlarge#1{%
  {\rm\Large #1}
}
\def\textrm#1{%
  {\rm #1}
}

こんにちは、だるおです。

突然ですが先日、2025年に開催される大阪・関西万博の『公式ロゴマーク』が発表されました。




その名も、

「いのちの輝き君」です。


これを始めてみたときは「うわきm...」と「$\mathbb{Kawaii}$」の間くらいの複雑な感情になりましたが、膨大な候補の中から選出されたロゴなので大阪の一市民でしかない僕は黙って受け入れるしかありません。




......さて、そんないのちの輝き君をなんとか見慣れてきた僕は、こう思いました。

$\textlarge{ターミナルでいのちの輝き君をアニメーション表示させたい!}$


そう、「この強烈なロゴをターミナルにアニメーション表示させたい」という気持ちがフツフツと湧いてきたのです。これが愛府心というものなのでしょうか。


「大阪・関西万博の『公式ロゴマーク』」という尊い使命を背負って生まれてきたこのいのちの輝き君にとって、多種多様な形で表現されることは本望に違いありません。ならば、きっとアニメーション表示されることも望んでいることでしょう!




......というわけで、さっそくbashスクリプトで書いていきたいと思います。



bashでアニメーション表示させるには

bashでアニメーションを表現する場合、1行であればprintfの\rを用いたり、以下のような、clearを用いたちょっと乱暴な方法もあります。

#!/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を用いて実装します。


決して次の方法しか知らなかった、とかではありません。



AAの準備

アニメーションの前に、まずはAA(アスキーアート)を準備しなければいけません。
AA変換(アスキーアート生成)
このサイトでいのちの輝き君の画像をAAに変換します。


                            ..+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?!

$\textlarge{Kawaii......}$



素晴らしいですね。あのいのちの輝き君の愛くるしさ、躍動感が損なわれずアスキーアートに変換されています。


これをもとに、目玉の部分が動いた差分も用意します。

                            ..+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?!

$\textlarge{Yeah......}$


いかがでしょう、目をきょろっと別の方向に向かせました。想像通りのキュートさです。



この調子であと何種類か用意しましょう。私は合計5種類用意しました。

コード実装

#!/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で回数分ループさせる構造に、必要行数分を画面初期化したのち表示させるといった処理をさせています。



はじめに表示させるアスキーアートの変数名は「いのちの輝き君」から、「INOCHINOKAGAYAKI」と名付けたのですが、SEKAI NO OWARIみたいでほっこりした気持ちになりました。


アニメーション差分のアスキーアートの変数は、英語で動作を表すingをつけて、「INOCHINOKAGAYAKING」と名付けたのですが、あまりにも躍動感があふれていたため、作業デスクから逃げ出したい気持ちになりました。

完成!Bashいのちの輝き君アニメーション!!

$\textlarge{SUPER BEAUTIFUL......}$


いかがでしょう。このキョロキョロした目の玉の動き方はまさに大阪・関西万博の象徴。そしてそのうごめく姿は愛くるしく、こちらに何か語りかけているようにも見えます。




深夜この記事の確認作業で、突然画面に大きくこのGifが表示されたときは思わず叫んでしまいました。


......さあ、いかがでしたでしょうか?



今回は頑張ってBashを用いてターミナルにいのちの輝き君をアニメーション表示させたわけですが、これによって得した人間は誰一人いないという奇跡のようなQiita記事でしたね。



もし記事を読んでいるMac勢の方がいらっしゃいましたら、是非とも暇つぶしにしてみてはいかがでしょうか。せめて誰かの役に立ちたいので。






以上、だるおがお送りしました。





それではさようなら。