#!/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.