1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
#!/bin/bash
# Draw-box.sh: Drawing a box using ASCII characters.
# Script by Stefano Palmeri, with minor editing by document author.
# Minor edits suggested by Jim Angstadt.
# Used in the ABS Guide with permission.
######################################################################
### draw_box function doc ###
# The "draw_box" function lets the user
#+ draw a box in a terminal.
#
# Usage: draw_box ROW COLUMN HEIGHT WIDTH [COLOR]
# ROW and COLUMN represent the position
#+ of the upper left angle of the box you're going to draw.
# ROW and COLUMN must be greater than 0
#+ and less than current terminal dimension.
# HEIGHT is the number of rows of the box, and must be > 0.
# HEIGHT + ROW must be <= than current terminal height.
# WIDTH is the number of columns of the box and must be > 0.
# WIDTH + COLUMN must be <= than current terminal width.
#
# E.g.: If your terminal dimension is 20x80,
# draw_box 2 3 10 45 is good
# draw_box 2 3 19 45 has bad HEIGHT value (19+2 > 20)
# draw_box 2 3 18 78 has bad WIDTH value (78+3 > 80)
#
# COLOR is the color of the box frame.
# This is the 5th argument and is optional.
# 0=black 1=red 2=green 3=tan 4=blue 5=purple 6=cyan 7=white.
# If you pass the function bad arguments,
#+ it will just exit with code 65,
#+ and no messages will be printed on stderr.
#
# Clear the terminal before you start to draw a box.
# The clear command is not contained within the function.
# This allows the user to draw multiple boxes, even overlapping ones.
### end of draw_box function doc ###
######################################################################
draw_box(){
#=============#
HORZ="-"
VERT="|"
CORNER_CHAR="+"
MINARGS=4
E_BADARGS=65
#=============#
if [ $# -lt "$MINARGS" ]; then # If args are less than 4, exit.
exit $E_BADARGS
fi
# Looking for non digit chars in arguments.
# Probably it could be done better (exercise for the reader?).
if echo $@ | tr -d [:blank:] | tr -d [:digit:] | grep . &> /dev/null; then
exit $E_BADARGS
fi
BOX_HEIGHT=`expr $3 - 1` # -1 correction needed because angle char "+"
BOX_WIDTH=`expr $4 - 1` #+ is a part of both box height and width.
T_ROWS=`tput lines` # Define current terminal dimension
T_COLS=`tput cols` #+ in rows and columns.
if [ $1 -lt 1 ] || [ $1 -gt $T_ROWS ]; then # Start checking if arguments
exit $E_BADARGS #+ are correct.
fi
if [ $2 -lt 1 ] || [ $2 -gt $T_COLS ]; then
exit $E_BADARGS
fi
if [ `expr $1 + $BOX_HEIGHT + 1` -gt $T_ROWS ]; then
exit $E_BADARGS
fi
if [ `expr $2 + $BOX_WIDTH + 1` -gt $T_COLS ]; then
exit $E_BADARGS
fi
if [ $3 -lt 1 ] || [ $4 -lt 1 ]; then
exit $E_BADARGS
fi # End checking arguments.
plot_char(){ # Function within a function.
echo -e "\E[${1};${2}H"$3
}
echo -ne "\E[3${5}m" # Set box frame color, if defined.
# start drawing the box
count=1 # Draw vertical lines using
for (( r=$1; count<=$BOX_HEIGHT; r++)); do #+ plot_char function.
plot_char $r $2 $VERT
let count=count+1
done
count=1
c=`expr $2 + $BOX_WIDTH`
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $c $VERT
let count=count+1
done
count=1 # Draw horizontal lines using
for (( c=$2; count<=$BOX_WIDTH; c++)); do #+ plot_char function.
plot_char $1 $c $HORZ
let count=count+1
done
count=1
r=`expr $1 + $BOX_HEIGHT`
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $r $c $HORZ
let count=count+1
done
plot_char $1 $2 $CORNER_CHAR # Draw box angles.
plot_char $1 `expr $2 + $BOX_WIDTH` $CORNER_CHAR
plot_char `expr $1 + $BOX_HEIGHT` $2 $CORNER_CHAR
plot_char `expr $1 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH` $CORNER_CHAR
echo -ne "\E[0m" # Restore old colors.
P_ROWS=`expr $T_ROWS - 1` # Put the prompt at bottom of the terminal.
echo -e "\E[${P_ROWS};1H"
}
# Now, let's try drawing a box.
clear # Clear the terminal.
R=2 # Row
C=3 # Column
H=10 # Height
W=45 # Width
col=1 # Color (red)
draw_box $R $C $H $W $col # Draw the box.
exit 0
# Exercise:
# --------
# Add the option of printing text within the drawn box.
|