⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 draw-box.sh

📁 BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版
💻 SH
字号:
#!/bin/bash# Draw-box.sh: 使用ASCII字符画一个盒子. # 由Stefano Palmeri编写, 本书作者做了少量修改. # 经过授权, 可以在本书中使用. #########################################################################  draw_box函数注释  ####  "draw_box"函数可以让用户#+ 在终端上画一个盒子. ##  用法: draw_box ROW COLUMN HEIGHT WIDTH [COLOR] #  ROW和COLUMN用来定位你想要#+ 画的盒子的左上角. #  ROW和COLUMN必须大于0, #+ 并且要小于当前终端的尺寸. #  HEIGHT是盒子的行数, 并且必须 >0 . #  HEIGHT + ROW 必须 <= 终端的高度. #  WIDTH是盒子的列数, 必须 >0 .#  WIDTH + COLUMN 必须 <= 终端的宽度. ## 例如: 如果你的终端尺寸为20x80, #  draw_box 2 3 10 45 是合法的#  draw_box 2 3 19 45 的HEIGHT是错的 (19+2 > 20)#  draw_box 2 3 18 78 的WIDTH是错的 (78+3 > 80)##  COLOR是盒子边框的颜色. #  这是第5个参数, 并且是可选的. #  0=黑 1=红 2=绿 3=棕褐 4=蓝 5=紫 6=青 7=白.#  如果你传递给函数的参数错误, #+ 它将会退出, 并返回65, #+ 不会有消息打印到stderr上. ##  开始画盒子之前, 会清屏. #  函数内不包含清屏命令. #  这样就允许用户画多个盒子, 甚至可以叠加多个盒子. ###  draw_box函数注释结束  ### ######################################################################draw_box(){#=============#HORZ="-"VERT="|"CORNER_CHAR="+"MINARGS=4E_BADARGS=65#=============#if [ $# -lt "$MINARGS" ]; then                 # 如果参数小于4, 退出.     exit $E_BADARGSfi# 找出参数中非数字的字符. # 还有其他更好的方法么(留给读者作为练习?). if echo $@ | tr -d [:blank:] | tr -d [:digit:] | grep . &> /dev/null; then   exit $E_BADARGSfiBOX_HEIGHT=`expr $3 - 1`   #  必须-1, 因为边角的"+"是BOX_WIDTH=`expr $4 - 1`    #+ 高和宽共有的部分. T_ROWS=`tput lines`        #  定义当前终端的T_COLS=`tput cols`         #+ 长和宽的尺寸.          if [ $1 -lt 1 ] || [ $1 -gt $T_ROWS ]; then    #  开始检查参数   exit $E_BADARGS                             #+ 是否正确. 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                                 # 参数检查结束. plot_char(){                       # 函数内的函数.    echo -e "\E[${1};${2}H"$3}echo -ne "\E[3${5}m"               # 如果定义了, 就设置盒子边框的颜色. # 开始画盒子count=1                                         #  使用plot_char函数for (( r=$1; count<=$BOX_HEIGHT; r++)); do      #+ 画垂直线.   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                                        #  使用plot_char函数for (( c=$2; count<=$BOX_WIDTH; c++)); do      #+ 画水平线.   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                   # 画盒子的角. plot_char $1 `expr $2 + $BOX_WIDTH` +plot_char `expr $1 + $BOX_HEIGHT` $2 +plot_char `expr $1 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH` +echo -ne "\E[0m"             #  恢复原来的颜色. P_ROWS=`expr $T_ROWS - 1`    #  在终端的底部打印提示符. echo -e "\E[${P_ROWS};1H"}      # 现在, 让我们开始画盒子吧. clear                       # 清屏. R=2      # 行C=3      # 列H=10     # 高W=45     # 宽col=1    # 颜色(红)draw_box $R $C $H $W $col   # 画盒子. exit 0# 练习:# -----# 添加一个选项, 用来支持可以在所画的盒子中打印文本. 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -