📄 draw-box.sh
字号:
#!/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 into 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=4E_BADARGS=65#=============#if [ $# -lt "$MINARGS" ]; then # If args are less than 4, exit. exit $E_BADARGSfi# 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_BADARGSfiBOX_HEIGHT=`expr $3 - 1` # -1 correction needed because angle char "+" is BOX_WIDTH=`expr $4 - 1` #+ 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.fiif [ $2 -lt 1 ] || [ $2 -gt $T_COLS ]; then exit $E_BADARGSfiif [ `expr $1 + $BOX_HEIGHT + 1` -gt $T_ROWS ]; then exit $E_BADARGSfiif [ `expr $2 + $BOX_WIDTH + 1` -gt $T_COLS ]; then exit $E_BADARGSfiif [ $3 -lt 1 ] || [ $4 -lt 1 ]; then exit $E_BADARGSfi # 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 boxcount=1 # Draw vertical lines usingfor (( r=$1; count<=$BOX_HEIGHT; r++)); do #+ plot_char function. plot_char $r $2 $VERT let count=count+1done count=1c=`expr $2 + $BOX_WIDTH`for (( r=$1; count<=$BOX_HEIGHT; r++)); do plot_char $r $c $VERT let count=count+1done count=1 # Draw horizontal lines usingfor (( c=$2; count<=$BOX_WIDTH; c++)); do #+ plot_char function. plot_char $1 $c $HORZ let count=count+1done count=1r=`expr $1 + $BOX_HEIGHT`for (( c=$2; count<=$BOX_WIDTH; c++)); do plot_char $r $c $HORZ let count=count+1done plot_char $1 $2 $CORNER_CHAR # Draw box angles.plot_char $1 `expr $2 + $BOX_WIDTH` $CORNER_CHARplot_char `expr $1 + $BOX_HEIGHT` $2 $CORNER_CHARplot_char `expr $1 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH` $CORNER_CHARecho -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 # RowC=3 # ColumnH=10 # HeightW=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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -