带格式和颜色输出的 bash 脚本

带格式和颜色输出的 bash 脚本

Chris Yue No Comment
Posts

谁说程序员毫无审美情趣的,没看见开源社区里的好多跑在命令行下的程序或者脚本都开始带上美美的颜色了吗?

sf console

实现图中彩色文字输出其实很简单,用一个特殊的字符告诉终端或者 shell 接下来的文字要使用指定的颜色输出就行了。这个特殊的字符就是 <ESC>,在 bash 里可以用如下字符表示 \e \033 \x1B

\e 后面接一个 [ 表示开始指定格式、颜色。如果你用比如 Ubuntu 那样的发行版,可以在终端尝试输入如下内容查看效果:

echo -e "\e[31mred"

* To Mac 用户:如果以上代码没有效果,请先看此文后面部分

格式和颜色都是使用一个数字来表示。比如上例中的 31,它仅表示红色。其他的数字的含义大家可跳转到这个网页查看,这个网站还有支持 256 色的写法很值得参考(这个网站没有提到 3,但在某些终端下 3 表示斜体格式)。

另外,格式的指定是支持组合的,用法也特别简单,只需要用分号 ; 将数字两两分隔就好了:

echo -e "\e[4;31;5mhello"

不过这格式的确是有点儿复杂跟乱码似的。如果你是在脚本里写,用一个变量先设置一下会大大提升可读性:

#!/bin/bash
RED="\e[31m"
GREEN="\e[32m"
echo -e "h${RED}el${GREEN}lo";

To Mac 用户:在你的 Mac 终端上执行以上代码,可能会出现没效果的情况……我也入坑半天才发现,原来 Mac 的 Bash 是不支持 -e 参数的……(通过 man echo 得知)

知道原因这问题也就好解决了,如果想让 Mac 终端支持颜色字符,最简单的方法就是把 bash 换了。比如换成 zsh(再加上惊为天人的 oh-my-zsh 多棒!这个时候如果是写脚本记得把第一行改成 #!/bin/zsh)。但如果你不想换,或者你写脚本时依然用的是 #!/bin/bash,那么你还有一种选择就是用 printf 代替 echo:

printf "\e[31mred"

printfecho 还是有细微差别的。echo 会自动添加 \n 但 printf 不会,这点需要注意。

带格式和颜色输出的 bash 脚本 by Chris Yue is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

微信赞赏码

写作累,服务器还越来越贵
求分担,祝愿好人一生平安
天使打赏人

发表评论

35 − 28 =