Generate your own ASCII Table

Traditionally, a book of this sort has an ASCII Table appendix. This book does not. Instead, here are several short scripts, each of which generates a complete ASCII table.

A script that generates an ASCII table

#!/bin/bash # ascii.sh # ver. 0.2, reldate 26 Aug 2008 # Patched by ABS Guide author.

# Original script by Sebastian Arming. # Used with permission (thanks!).

exec >ASCII.txt # Save stdout to file, #+ as in the example scripts #+ reassign-stdout.sh and upperconv.sh.

MAXNUM=256 COLUMNS=5 OCT=8 OCTSQU=64 LITTLESPACE=-3 BIGSPACE=-5

i=1 # Decimal counter o=1 # Octal counter

while [ "$i" -lt "$MAXNUM" ]; do # We don't have to count past 400 octal. paddi=" $i" echo -n "${paddi: $BIGSPACE} " # Column spacing. paddo="00$o" # echo -ne "\\${paddo: $LITTLESPACE}" # Original. echo -ne "\\0${paddo: $LITTLESPACE}" # Fixup. # ^ echo -n " " if (( i % $COLUMNS == 0)); then # New line. echo fi ((i++, o++)) # The octal notation for 8 is 10, and 64 decimal is 100 octal. (( i % $OCT == 0)) && ((o+=2)) (( i % $OCTSQU == 0)) && ((o+=20)) done

exit $?

# Compare this script with the "pr-asc.sh" example. # This one handles "unprintable" characters.

# Exercise: # Rewrite this script to use decimal numbers, rather than octal.

Another ASCII table script

#!/bin/bash # Script author: Joseph Steinhauser # Lightly edited by ABS Guide author, but not commented. # Used in ABS Guide with permission.

#------------------------------------------------------------------------- #-- File: ascii.sh Print ASCII chart, base 10/8/16 (JETS-2012) #------------------------------------------------------------------------- #-- Usage: ascii [oct|dec|hex|help|8|10|16] #-- #-- This script prints out a summary of ASCII char codes from Zero to 127. #-- Numeric values may be printed in Base10, Octal, or Hex. #-- #-- Format Based on: /usr/share/lib/pub/ascii with base-10 as default. #-- For more detail, man ascii . . . #-------------------------------------------------------------------------

[ -n "$BASH_VERSION" ] && shopt -s extglob

case "$1" in oct|[Oo]?([Cc][Tt])|8) Obase=Octal; Numy=3o;; hex|[Hh]?([Ee][Xx])|16|[Xx]) Obase=Hex; Numy=2X;; help|?(-)[h?]) sed -n '2,/^[ ]*$/p' $0;exit;; code|[Cc][Oo][Dd][Ee])sed -n '/case/,$p' $0;exit;; *) Obase=Decimal esac # CODE is actually shorter than the chart!

printf "\t\t## $Obase ASCII Chart ##\n\n"; FM1="|%0${Numy:-3d}"; LD=-1

AB="nul soh stx etx eot enq ack bel bs tab nl vt np cr so si dle" AD="dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us sp"

for TOK in $AB $AD; do ABR[$((LD+=1))]=$TOK; done; ABR[127]=del

IDX=0 while [ $IDX -le 127 ] && CHR="${ABR[$IDX]}" do ((${#CHR}))&& FM2='%-3s'|| FM2=`printf '\\\\%o ' $IDX` printf "$FM1 $FM2" "$IDX" $CHR; (( (IDX+=1)%8))||echo '|' done

exit $?

A third ASCII table script, using awk

#!/bin/bash # ASCII table script, using awk. # Author: Joseph Steinhauser # Used in ABS Guide with permission.

#------------------------------------------------------------------------- #-- File: ascii Print ASCII chart, base 10/8/16 (JETS-2010) #------------------------------------------------------------------------- #-- Usage: ascii [oct|dec|hex|help|8|10|16] #-- #-- This script prints a summary of ASCII char codes from Zero to 127. #-- Numeric values may be printed in Base10, Octal, or Hex (Base16). #-- #-- Format Based on: /usr/share/lib/pub/ascii with base-10 as default. #-- For more detail, man ascii #-------------------------------------------------------------------------

[ -n "$BASH_VERSION" ] && shopt -s extglob

case "$1" in oct|[Oo]?([Cc][Tt])|8) Obase=Octal; Numy=3o;; hex|[Hh]?([Ee][Xx])|16|[Xx]) Obase=Hex; Numy=2X;; help|?(-)[h?]) sed -n '2,/^[ ]*$/p' $0;exit;; code|[Cc][Oo][Dd][Ee])sed -n '/case/,$p' $0;exit;; *) Obase=Decimal esac export Obase # CODE is actually shorter than the chart!

awk 'BEGIN{print "\n\t\t## "ENVIRON["Obase"]" ASCII Chart ##\n" ab="soh,stx,etx,eot,enq,ack,bel,bs,tab,nl,vt,np,cr,so,si,dle," ad="dc1,dc2,dc3,dc4,nak,syn,etb,can,em,sub,esc,fs,gs,rs,us,sp" split(ab ad,abr,",");abr[0]="nul";abr[127]="del"; fm1="|%0'"${Numy:- 4d}"' %-3s" for(idx=0;idx<128;idx++){fmt=fm1 (++colz%8?"":"|\n") printf(fmt,idx,(idx in abr)?abr[idx]:sprintf("%c",idx))} }'

exit $?