Matrix(ish): a bash script with no practical application

Ok, just for (nerd) fun, here’s a Bash shell script that will output a Matrix-ish display in Terminal. I have no idea if it works outside of BSD on OS X, but it has a chance.

There’s a much better version of this effect written in C called “cmatrix” that you can install via Homebrew. That being said, I wanted to mess around with this in Bash anyway. Don’t ask me why.

Here’s what it looks like:

YouTube Video

Update: I modified the character set via the comment from Carl below, now it looks extra nifty:

YouTube Video

The script basically just takes an array of characters and an array of colors, randomly picking a combination of the two to stick in any character position. It uses cursor movements to randomly skip overwriting characters along the way, providing an illusion that characters are changing on the screen in random positions, rather than line by line.

The script takes two optional arguments. The first one is the spacing of the output. The higher the number, the more spaced out the characters are. The second argument is the scroll speed. Leaving that blank or setting it to 0 will result in no scrolling, things just change on the screen. The scrolling can add some interest to the effect, so experiment with it. The arguments must be used in order, if there’s only one argument it’s assumed to be the spacing. The defaults (no arguments) are 100 (spacing) and 0 (no scroll).

Here’s the script, just grab the raw version and save it in your path as matrixish and run chmod a+x on it to make it executable. Then try running matrixish, matrixish 50 2, etc. to get a feel for it. Hit Ctrl-C to stop the script (screen will be cleaned up automatically).

Colors can be customized in the script. Find the bit around line 24 that looks like:

colors=($green $brightgreen)

There’s a list of colors above that line that you can use in the array. Use as many or as few as you like (at least one) and those colors will be randomly picked from when display characters.

Here’s the script, have fun (raw version).

matrixish.shraw
#!/bin/bash
#
# matrix: matrix-ish display for Bash terminal
# Author: Brett Terpstra 2012 <http://brettterpstra.com>
# Contributors: Lauri Ranta and Carl <http://blog.carlsensei.com/>
#
# A morning project. Could have been better, but I'm learning when to stop.

### 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

Ryan Irelan has produced a series of shell trick videos based on BrettTerpstra.com posts. Readers can get 10% off using the coupon code TERPSTRA.

Brett Terpstra

Brett is a writer and developer living in Minnesota, USA. You can follow him as ttscoff on Twitter, GitHub, and Mastodon. Keep up with this blog by subscribing in your favorite news reader.

This content is supported by readers like you.