最终效果
1. 自定义表格样式
2. 自定义主题颜色
- 支持三系普通颜色
- 支持16色彩虹色
- 支持单颜色
回顾一下shell语法
1. shell传递参数
我们可以在执行shell
脚本时实时传递参数从而指定某些具体的参数(在本例中包括表格的样式、颜色等),脚本中获取参数的格式为$n
。其中除n
为0
表示执行的文件名外,1
表示第一个参数,2
表示第二个参数,以此类推。
- 每一模式必须以右括号结束
- 匹配到取值符合某一模式后,执行模式所有命令直到
;;
- 一旦模式匹配则不会执行其他模式
- 如果无一模式匹配,可以使用
*
捕获该值
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
在实例中,我们通过第一个参数指定style
的值来选择不同的表格形式(具体的表格形式由制表符向量tbs
实现)。另外当第一个参数以-h
或者--h
开头时,我们可以输出help
信息:
style="$1"
case $style in
# 根据第一个参数为-0或-1或-2来实现不同的表格样式, 即给tbs赋不同的值
-0) tbs=" ";;
-1) tbs="└┴┘├┼┤┌┬┐ ───│││";;
-2) tbs="└─┘│┼│┌─┐ ───│││";;
# 如果第一个参数以%开头, 意味着我们可以外部指定tbs的值
# 把style变量开头的%去掉赋值给tbs
"%"*) tbs="${style/"%"/}";;
-h*|--h*)
echo '
t [ --- HELP --- ]
t command : draw_table.sh [style] [colors] < <file >
t pipo : echo -e AtBnatb | draw_table.sh [style] [colors]
t [style] : input 16 characters
t 1~9 is Num. keypad as table,10 is not used
t 11~13 are left,middle,right in a row
t 14~16 are left,middle,right in a column
t
t [colors]: input a list,like "-3,-4,-8" sames "-green,-yellow,-white"
t It set color,table cross ,font ,middle. Or 033[xxm .
t And support custom color set every characters of sytle
t Like "033[30m,-red,-yellow,,,,,,,,,,,,," sum 16.
'
exit
;;
esac
# ${var:-DEFAULT}: 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值
tbs="${tbs:-"+++++++++,---|||"}"
2. awk命令
awk
命令:依次对每一行进行处理,但是相比于sed
更擅长取列,个人感觉是类SQL
的文本搜索工具。
awk
的基本形式如下:
awk [-F|-f|-v] 'BEGIN{ 命令 } pattern{ 命令 } END{ 命令 }' file
参数:
-F: 指定分隔符
-f: 调用脚本
-v: 使用var=value的格式定义变量
特殊变量:
NF: 字段数量
NR: 当前处理的行数
FILENAME: 当前文件名
三个语句块:
BEGIN{ 命令 }: 执行前的命令
pattern{ 命令 }: 处理每一行执行的命令
END{ 命令 }: 执行完所有行后的命令
3. 自定义输出颜色
格式如下:
echo -e "033[字背景颜色;字体颜色m字符串033[0m"
# 颜色调用始末是固定的:
033[ ; m …… 033[0m
# 实例:
echo -e "033[41;36m someword 033[0m"
设计思路
1. 计算和绘制表格相关的全局变量
cols_len[NF]
:存储了每一列的最大长度, 每列最大长度等于该列最长的元素的长度rows[NR][NF]
:将文件的每行每列的数据记录到rows
二维数组中rows[NR][0]
:rows
第0
列存储前一行和后一行的列数, 用于确定当行的表格样式colors[16]
:存储每个制表符对应的着色方案tbs[16]
:存储已经着色的制表符,其中制表符样式类似于╚ ╩ ╝ ╠ ╬ ╣ ╔ ╦ ╗ , ═ ═ ═ ║ ║ ║
,前1~9
个为表格骨架的样式,第10
表示着表格元素空格的填充,11~13
分别表示上边框、中间和下边框的连接符,第14~16
表示左边框、中间和右边框的连接符
2. 生成表格样式
由于涉及到单列,因此需要考虑到单列的情况生成如下一些表格样式变量:
# ------------------------------------------预存所有的表格线, 减少不必要的重复计算------------------------------------------
title_top = line_val("title_top")
title_mid = line_val("title_mid")
title_btm_mid = line_val("title_btm_mid")
title_top_mid = line_val("title_top_mid")
title_btm = line_val("title_btm")
top = line_val("top")
mid = line_val("mid")