# Appendix T. 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.

Example T.1. 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.
echo -n "\${paddi: \$BIGSPACE}  "       # Column spacing.
#       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.
```

Example T.2. 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 \$?
```

Example T.3. 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,"