Circuit Static Circuit Static - 4 months ago 21
Linux Question

How to make yor own matrix style screensaver in bash

I recently decided I wanted a CLI only "Screensaver"
style script to run on some of the systems I have up
that do not have any form of UI. (Most notably Linux servers)

I created the file listed in the Answer section that can do just that with a single, simple bash file.

Answer

Put the following in a new shell script. I called mine matrix.sh, then dont forget to update your files permissions (as per below)

sudo chmod +X ~/matrix.sh
#!/bin/bash
#
# Welcome to the Matrix Bash terminal
# Author: Circuit Static

### Customization:
blue="\033[0;34m"
brightblue="\033[1;34m"
cyan="\033[0;36m"
brightcyan="\033[1;36m"
green="\033[0;32m"
brightgreen="\033[1;32m"
red="\033[0;31m"
brightred="\033[1;31m"
white="\033[1;37m"
black="\033[0;30m"
grey="\033[0;37m"
darkgrey="\033[1;30m"
# Choose the colors that will be used from the above list
# space-separated list
# e.g. `colors=($green $brightgreen $darkgrey $white)`
colors=($green $brightgreen)
### End customization

### Do not edit below this line
spacing=${1:-100} # the likelihood of a character being left in place
scroll=${2:-0} # 0 for static, positive integer determines scroll speed
screenlines=$(expr `tput lines` - 1 + $scroll)
screencols=$(expr `tput cols` / 2 - 1)

# chars=(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ^)
# charset via Carl:
chars=(ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン)

count=${#chars[@]}
colorcount=${#colors[@]}

trap "tput sgr0; clear; exit" SIGTERM SIGINT

if [[ $1 =~ '-h' ]]; then
    echo "Display a Matrix(ish) screen in the terminal"
    echo "Usage:        matrix [SPACING [SCROLL]]"
    echo "Example:  matrix 100 0"
    exit 0
fi


clear
tput cup 0 0
while :
    do for i in $(eval echo {1..$screenlines})
        do for i in $(eval echo {1..$screencols})
            do rand=$(($RANDOM%$spacing))
                case $rand in
                    0)
                        printf "${colors[$RANDOM%$colorcount]}${chars[$RANDOM%$count]} "
                        ;;
                    1)
                        printf "  "
                        ;;
                    *)
                        printf "\033[2C"
                        ;;
                esac
            done
            printf "\n"

            # sleep .005
        done
        tput cup 0 0
    done

This code has been tested and verified as a an answer/solution to this problem on Zorin Core 8.1 *built on Ubuntu 10.04 LTS