Bash (バッシュ) であそぼう 1
〜 Bash で Matrix のアレ 〜
2024-11-22 作成 福島
TOP > asob > bash-anime
[ TIPS | TOYS | OTAKU | LINK | MOVIE | CGI | AvTitle | ConfuTerm | HIST | AnSt | Asob | Shell ]

好き嫌いの問題ではない

デファクトスタンダードなのですよ。
Linux や Unix を自動化しようとしたら、Bash を使わざるを得ない。
何よりログインしたらまず目にするし、計算機を操作するなら Bash から離れることは出来ません。

まあ、でもちょっとやりすぎかな。
できるかな~どうかな~?とか考えてたらできちゃいました。
何の参考になるか分からないけど、あーそーびーましょっ。


1. スクリプト作成

Bash は二次元配列を扱えないので、改行コードをデリミタとしてエスケープしてからあとで戻す処理をしています。

コードは長いけど、ほとんどが表示用データ。動作に関係するのは一番下の 20 行程度。
テキストエディタで打ち込んむのが一番だけど、現実的じゃない。コピペでいっちゃってください。

' ' は空白文字 (スペースキーで入力) です。TAB 文字とは異なるので注意してください。

スクリプトの最初は空白文字ばかりなので打ち込んだ文字が判別できず、ストレスがたまると思います。

ファイル名: animation.sh
#!/usr/bin/bash

pages=(
# 1
'                 
                 
                 
                 
                 
                 
                 
                 
                 '
# 2
'              z  
                 
                 
                 
                 
                 
                 
                 
                 '
# 3
'    Z         i  
              z  
                 
                 
                 
                 
                 
                 
                 '
# 4
'G  _[   mS  ( = 3
    Z         i  
              z  
                 
                 
                 
                 
                 
                 '
# 5
':  pGy  YQ  y ] H
G  _[   mS  ( = 3
    Z         i  
              z  
                 
                 
                 
                 
                 '
# 6
'B VgU8S(E* V/ eu@
:  pGy  YQ  y ] H
G  _[   mS  ( = 3
    Z         i  
              z  
                 
                 
                 
                 '
# 7
'b 2E;XsLT9 xP M!w
B VgU8S(E* V/ eu@
:  pGy  YQ  y ] H
G  _[   mS  ( = 3
    Z         i  
              z  
                 
                 
                 '
# 8
'PFRpx(Y_%| 742Oy=
b 2E;XsLT9 xP M!w
B VgU8S(E* V/ eu@
:  pGy  YQ  y ] H
G  _[   mS  ( = 3
    Z         i  
              z  
                 
                 '
# 9
'WrBj*B_Q5;+87u5:p
PFRpx(Y_%| 742Oy=
b 2E;XsLT9 xP M!w
B VgU8S(E* V/ eu@
:  pGy  YQ  y ] H
G  _[   mS  ( = 3
    Z         i  
              z  
                 '
# 10
'n_k(z0q@uxV:tY|7p
WrBj*B_Q5;+87u5:p
PFRpx(Y_%| 742Oy=
b 2E;XsLT9 xP M!w
B VgU8S(E* V/ eu@
:  pGy  YQ  y ] H
G  _[   mS  ( = 3
    Z         i  
              z  '
# 11
'=DbX=U5sUK1dO6I'\''P
n_k\(z0q@ux:tY|7p
WrBj*B_Q5;+87u5:p
PFRpx(Y_%| 742Oy=
b 2E;XsLT9 xP M!w
B VgU8S(E* V/ eu@
:  pGy  YQ  y ] H
G  _[   mS  ( = 3
    Z         i  '
# 12
'!F;p6vbv<XTRiOKNi
=DbX=U5sUK1dO6I'\''P
n_k(z0q@uxV:tY|7p
WrBj*B_Q5;+87u5:p
PFRpx(Y_%| 742Oy=
b 2E;XsLT9 xP M!w
B VgU8S(E* V/ eu@
:  pGy  YQ  y ] H
G  _[   mS  ( = 3'
# 13
'Hsa3_51Iqq]w<)+8[
!F;p6vbv<XTRiOKNi
=DbX=U5sUK1dO6I'\''P
n_k(z0q@uxV:tY|7p
WrBj*B_Q5;+87u5:p
PFRpx(Y_%| 742Oy=
b 2E;XsLT9 xP M!w
B VgU8S(E* V/ eu@
:  pGy  YQ  y ] H'
# 14
'ab:D3myzTJ|EDZx*Z
Hsa3_51Iqq]w<)+8[
!F;p6vbv<XTRiOKNi
=DbX=U5sUK1dO6I'\''P
n_k(z0q@uxV:tY|7p
WrBj*B_Q5;+87u5:p
PFRpx(Y_%| 742Oy=
b 2E;XsLT9 xP M!w
B VgU8S(E* V/ eu@'
# 15
')0k>JS$jjvTl8j)gC
ab:D3myzTJ|EDZx*Z
Hsa3_51Iqq]w<)+8[
!F;p6vbv<XTRiOKNi
=DbX=U5sUK1dO6I'\''P
n_k(z0q@uxV:tY|7p
WrBj*B_Q5;+87u5:p
PFRpx(Y_%| 742Oy=
b 2E;XsLT9 xP M!w'
# 16
'F*wz0eU;1;_1FgQ*M
)0k>JS$jjvTl8j)gC
ab:D3myzTJ|EDZx*Z
Hsa3_51Iqq]w<)+8[
!F;p6vbv<XTRiOKNi
=DbX=U5sUK1dO6I'\''P
n_k(z0q@uxV:tY|7p
WrBj*B_Q5;+87u5:p
PFRpx(Y_%| 742Oy='
# 17
'vG+m/[I*od"_6C;T'\''
F*wz0eU;1;_1FgQ*M
)0k>JS$jjvTl8j)gC
ab:D3myzTJ|EDZx*Z
Hsa3_51Iqq]w<)+8[
!F;p6vbv<XTRiOKNi
=DbX=U5sUK1dO6I'\''P
n_k(z0q@uxV:tY|7p
WrBj*B_Q5;+87u5:p'
)


# ページ数を数える PageCnt=${#pages[@]} # 各ページについて、改行コードをエスケープする。 EncodedPages=() for (( n = 0 ; n < $PageCnt ; n ++ )) { EncodedPages[$n]=`echo -n "${pages[$n]}" | sed -z 's/\n/\\\\n/g'` }
CLEAR=$'\x1B'"[2J"$'\x1B'"[1;1H" # 画面をクリアする GREEN=$'\x1B'"[32;40m" # 文字の色を緑/黒にする NORMAL=$'\x1B'"[0m" # 文字の色を元に戻す # 画面を表示する (改行コードを戻しながら) for (( n = 0 ; n < $PageCnt ; n ++ )) { echo -n $CLEAR echo -----------------$GREEN echo "${EncodedPages[$n]}" | sed 's/\\n/\n/g' echo $NORMAL----------------- sleep 0.2 }


2. 実行

Linux で普通に実行します。
Windows に Bash はないので WSL をインストールしてから実行してください。

$ # Bash のバージョンを確認する。(Bash は互換性が非常に高いので、実は確認に意味がない)
$ bash --version 
GNU bash, バージョン 5.1.8(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ # animation.sh を実行する
$ # 実行と同時にこの画面はすぐにクリアされる
$ bash ./animation.sh 
-----------------
vG+m/[I*od'_6C;T' F*wz0eU;1;_1FgQ*M )0k>JS$jjvTl8j)gC ab:D3myzTJ|EDZx*Z Hsa3_51Iqq]w<)+8[ !F;p6vbv<XTRiOKNi =DbX=U5sUK1dO6I'P n_k(z0q@uxV:tY|7p WrBj*B_Q5;+87u5:p
----------------- $ exit