shell

先看看结果,结尾有GitHub的链接。

写一个小脚本

#!/bin/bash

for ((i=0; i<=50; i ++))
do
	echo "t${i}='\033[${i}m'" >> echoscript
done

for ((i=0; i<=50; i ++))
do
	echo echo -e \"\$t${i} 测试用文字 '${t0}'\" >> echoscript
done

然后,打开生成的echoscript,加shell脚本的必须代码

#!/bin/bash  //加入这行
t0='\033[0m'
......  // 中间的内容,省略掉
t50='\033[50m'
echo -e "$t0 测试用文字 ${t0}"
......  // 中间的内容,省略掉
echo -e "$t50 测试用文字 ${t0}"

保存,重命名文件,echoscript->echoscript.sh,并给它执行的权限。

mv echoscript echoscript.sh  // 改名
chmod +x echoscript.sh  //执行权限

执行脚本

./echoscript.sh

这时候,就可以从屏幕上看到,输出的结果了,这里就不做截图了。

实现原理

先借一张图来说明

颜色说明

格式说明:

  • -e选项:表示允许反斜杠(对字符)转义
  • \033[41;36m:称为转义序列,它本身是一个整体,中间不要有空格。
  • \033[:转义序列的开始。其中\033代表Esc符号,也可以使用\E\e来代替。(在Mac系统中\E\e是无效的。)
  • 4136是显示效果的数值,41表示背景是红色,36表示文字是青色。
  • 补充一下,效果这部分,分为输出特效格式控制光标位置格式控制,两类控制代码,这里只说输出特效格式控制,另外一类控制代码,自己在脚本中试一下,就可能看到效果。下面会给出代码表。
  • 输出特效格式控制:又可以分出3类,特效类、文字颜色、背景颜色。也看下面的表格吧。
  • m:转义序列的终止标志。
  • \033[0m:表示将颜色恢复成默认的配色。

好了,该上效果数值对照表了。

数值 效果(特效、文字颜色、背景颜色)
特效类 可以单独使用
0 重新设置属性到缺省设置
1 设置高亮
2 设置一半亮度
4 设置下划线
5 设置闪烁
7 设置反向图象
8 消隐
其他操作 需要配合使用
22 设置一般密度
24 关闭下划线
25 关闭闪烁
27 关闭反向图象
字体颜色 可以单独使用
30 设置文字黑色
31 设置文字红色
32 设置文字绿色
33 设置文字黄色
34 设置文字紫色
35 设置文字粉色
36 设置文字青色
37 设置文字白色
背景颜色 可以单独使用
40 设置黑色背景
41 设置红色背景
42 设置绿色背景
43 设置黄色背景
44 设置蓝色背景
45 设置粉色背景
46 设置青色背景
47 设置白色背景

那么,刚才生成的0-50的那个脚本,可以修改一下了,把无效的内容,删除一下。

好了,再试几个组合模式

#!/bin/bash

RBY='\033[31;43m'
RBY1='\033[1;31;43m'
RBY2='\033[2;31;43m'
RBY4='\033[4;31;43m'
RBY5='\033[5;31;43m'
RBY7='\033[7;31;43m'
RBY8='\033[8;31;43m'
RBY9='\033[1;4;5;31;43m'
RES='\033[0m'

echo -e "${RBY} 菜市场海报风格 ${RES}"
echo -e "${RBY1} 高亮菜市场海报风格 ${RES}"
echo -e "${RBY2} 不亮菜市场海报风格 ${RES}"
echo -e "${RBY4} 下划线菜市场海报风格 ${RES}"
echo -e "${RBY5} 闪烁菜市场海报风格 ${RES}"
echo -e "${RBY7} 反转菜市场海报风格 ${RES}"
echo -e "${RBY8} 消隐菜市场海报风格 ${RES}"
echo -e "${RBY9} 高亮+下划线+闪烁菜市场海报风格 ${RES}"

继续搞颜色

换个玩法

ECHO_SUCCESS="echo -en \\033[1;32m"
ECHO_FAILURE="echo -en \\033[1;31m"
ECHO_WARNING="echo -en \\033[1;33m"
ECHO_NORMAL="echo -en  \\033[0m"

$ECHO_SUCCESS && echo SUCCESS
$ECHO_FAILURE && echo FAILURE
$ECHO_WARNING && echo WARNING
$ECHO_NORMAL  && echo NORMAL

这里要注意2点:

  • -n\\的加入,这部分可以看看echo的一些基础讲解。
  • 这样连续写4行输出,看不出问题,但是,比如SUCCESS的下一行,接的是一个echo的直接输出,也会是绿色的。也就是说,结尾部分,没有\033[0m,后面的内容,就不会恢复到默认颜色。(可以看github内的echotest.sh文件)

换个姿势,还是搞颜色

玩法还有,这次使用tput,还是先看一下代码。

RED=$(tput setaf 1)
GREEN=$(tput setab 2)
RESET=$(tput sgr0)
echo "${RED}red text ${GREEN}green text${RESET}"

刚才的是红配黄,这次换个经典的红配绿😂

简单说明一下:

  • tput这个命令还有很多的玩法,这篇就不详解了。
  • setaf这个参数是设置文字颜色。
  • setab这个参数是设置背景颜色。
  • sgr0这个参数是恢复默认。

来个颜色和数值的对应表

数值 0 1 2 3 4 5 6 7
颜色 黑色 红色 绿色 黄色 紫色 洋红色 青色 白色

可以看出,跟上面说的\033[0m一样,没有sgr0,对文字效果的设置,都会保持到后面的输出内容上。

今天就到这里吧。

扩展知识,有兴趣研究的,看一下:

ANSI escape code英文版

ANSI转义序列中文版

这里面的代码,都提交到GitHub上。需要的请自取。

https://github.com/jarodsun/shell.practice