ルギア君の戯言

雑多な記事。

SL コマンド

Bash スクリプトで作ってみた。

本家の sl は SIGINT を受け付けないようになっているが、Bash ではできないので、代りに /tmp/tmp.?????? にゴミを残すことにした(ぇ

#!/bin/bash

set -m
tmpdir=`mktemp -d`
pushd $tmpdir 1>/dev/null 2>/dev/null
cat <<"EOF" > sl_s1.txt
                      (@@) (  ) (@)  ( )  @@    ()    @     O     @     O      @ 
                 (   )                                                           
             (@@@@)                                                              
          (    )                                                                 
                                                                                 
        (@@@)                                                                    
                                                                                 
EOF
cat <<"EOF" > sl_s2.txt
                      (  ) (@@) ( )  (@)  ()    @@    O     @     O     @      O 
                 (@@@)                                                           
             (    )                                                              
          (@@@@)                                                                 
                                                                                 
        (   )                                                                    
                                                                                 
EOF
cat <<"EOF" >sl_w1.txt
__/ =| o |=-O=====O=====O=====O \ ____Y___________|__|__________________________|_
 |/-=|___|=    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_| 
  \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/  
EOF
cat <<"EOF" >sl_w2.txt
__/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__|__________________________|_
 |/-=|___|=O=====O=====O=====O   |_____/~\___/          |_D__D__D_|  |_D__D__D_| 
  \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/  
EOF
cat <<"EOF" >sl_w3.txt
__/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__|__________________________|_"
 |/-=|___|=    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_| 
  \_/      \O=====O=====O=====O_/      \_/               \_/   \_/    \_/   \_/    
EOF
cat <<"EOF" >sl_w4.txt
__/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__|__________________________|_
 |/-=|___|=    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_| 
  \_/      \_O=====O=====O=====O/      \_/               \_/   \_/    \_/   \_/    
EOF
cat <<"EOF" >sl_w5.txt
__/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__|__________________________|_ 
 |/-=|___|=   O=====O=====O=====O|_____/~\___/          |_D__D__D_|  |_D__D__D_| 
  \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/    
EOF
cat <<"EOF" >sl_w6.txt
__/ =| o |=-~O=====O=====O=====O\ ____Y___________|__|__________________________|_ 
 |/-=|___|=    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_| 
  \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/    
EOF

cat <<"EOF" > sl_b.txt
      ====        ________                ___________                            
  _D _|  |_______/        \__I_I_____===__|_________|                            
   |(_)---  |   H\________/ |   |        =|___ ___|      _________________       
   /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
  |      |  |   H  |__--------------------| [___] |   =|                        |
  | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
  |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|
EOF
s=0
w=0
for f in $(seq 0 11); do
    cat sl_s$((s%2+1)).txt sl_b.txt sl_w$((w%6+1)).txt > sl_m${f}.txt
    s=$((s+1))
    w=$((w+1))
done

i=1
for f in $(seq 1 161); do
    cat <<EOF
$(
    clear
    h=$((f-80))
    for g in $(seq 1 $(wc -l sl_m1.txt | cut -f 1 -d " ")); do
        if [ $h -le 0 ]; then
            printf "%80s\n" "$(sed -e "$g ! d;s:^\\(.\\{$f\\}\\).*\$:\\1:" sl_m$((i%12)).txt)"
        else
            printf "%-80s\n" "$(sed -e "$g ! d;s:^.\\{$h\\}\\(.\\{$((81-h))\\}\\).*\$:\\1:" sl_m$((i%12)).txt)"
        fi
    done
)
EOF
    i=$((i+1))
    fg 1>/dev/null 2>/dev/null || :
    sleep 0.1 &
done

popd 1>/dev/null 2>/dev/null
rm -rf --preserve-root $tmpdir
clear

考え方は sl.js と同じ。端末幅も取得できない(?) ので 80 固定で列車長がたまたま 81 だったので、実はメインのループ内の条件分岐の条件が1つ少ない。

bash さんが遅いので (このプログラムの仕方もどうかと思うが)、clear とそのあとの動作が行われる時間に差が出来て見にくくなるので、こうするしかなかったんだ。だからもしかしたら端末によっては動かないかも。