在印象中,好像终端就是黑白界面,加扁平输出。是不是很乏味?其实现在 Linux/Unix 系统中带的终端模拟器是支持动画和彩色输出的。下面,一起来看看字符界面下的动画魅力!

1 定点输出

1.1 回车符(carriage return)

在这之前,我一直下意识的以为回车符和换行符是一个意思,相信有很多人也有这种错误的理解。其实不然,回车符(\r)是把光标返回到行首,而换行符(\n)才是把光标移到下一行。尽管在 Linux 中,是采用换行符作为新行的标识,但终端模拟器中还是会响应回车符 [1]。

OK,在理解了回车符和换行符的区别后,我们考虑一种情况:当在一行结束的时候,只输出回车符,而没有换行符,会发生什么?由于没有换行,只回到了行首,所以新打印的内容会把当前行覆盖。而我们可以基于这个特性,在脚本中做一些很有意思的动画。这里我写了一个例子,可以尝试一下:

  1. #!/bin/bash
  2. spin=('\' '|' '/' '-')
  3. cnt=0
  4. while(true)
  5. do
  6. echo -n "handling $((cnt++)), please wait... ${spin[$((cnt % 4))]}"
  7. echo -n -e \\r
  8. sleep 0.2
  9. done

这里的关键就是 -n,强制 echo 不输出换行符。

1.2 光标移动(CSI码)

单纯在同一行做文章,可能还无法满足一些动画。这时候,可以采用 CSI 码来手动移动光标。CSI(private mode character) 是用来格式化终端的输出。其序列定义为 [ESC][ + N1; N2; ... S,而 ESC 可以用 \e\033 和\x1B 来表示。这里我们简单的控制一下输出:

  1. echo -en '\e[2J\e[7;40f this is a test\e[6;38f this is another teset\n\n'

这条命令首先用 \e[2J 来清屏,\e[7;40f 把光标移到到 7,40,输出内容,然后 \e[6;38f 把光标移动到 6,38,再输出内容。具体的 CSI 码可以在 wiki 找到,发挥你的想象力吧。

Linux 下有一个 tput 命令,可以设置终端的属性,若不想用 CSI 码,可以用 tput 代替,具体可以查看 tput 联机文档。

2 色彩化输出

现在输出位置可以自由控制了,那就只剩下颜色了。终端中的颜色也是通过 SGR(select graphic rendition) 码来控制。SGR 是 CSI 的一个子集,其格式为 CSI + N + m。其中 N 就是指定颜色的。可以利用 SGR 码来设定字体、加粗、下划线、背景色和前景色。具体效果可以在 flogisoft 查看,做的很全。这里只举一些基本的例子。

  1. echo -e 'this is a \e[1mtest'
  2. echo -e 'this is a \e[1;31mtest'
  3. echo -e 'this is a \e[1;4;31mtest'

可以看到,有一些效果是可以叠加的。只需中间用分号隔开就可以。

3 一些有趣的例子和工具

在分析完基本的东西后,一起来看看世界各地蛋疼的人做的成果。这里不是否定他们的工作,事实上,我也是这类人。

首先看一下我刚写的,打印一个倒三角形,然后加上一些颜色:

  1. #!/bin/bash
  2. while true
  3. do
  4. for i in {20..1}
  5. do
  6. echo -en "\e[38;5;$((RANDOM % 256))m"
  7. # expand twice
  8. eval printf \' %.0s\' {1..$((41 - i))}
  9. eval printf \''#%.0s'\' {1..$((2*i -1))}
  10. echo -e "\e[0m"
  11. done
  12. echo -en "\e[20F"
  13. sleep 0.2
  14. done

这里在 for 循环中打印三角形,然后用 \e[20F 向上移动 20 行,再继续打印三角形。而\e[38;5;$((RANDOM % 256))m 会在 256 中颜色中随机选择一种颜色。来看一下具体效果:

如果你喜欢《黑客帝国》,可以安装 cmatrix(apt-get install cmatrix),体验一下字符刷屏的效果。如果你是《星球大战》的粉丝,可以运行一下这个命令 telnet towel.blinkenlights.nl,体验一下字符界面下的电影。如果你想要震撼的效果,字符界面下的分形图像,可以运行 bb(apt-get install bb)

另外,如果你想把自己的文字变的很绚丽,可以试一下 toilet,你没看错,就这名字。

  1. toilet -f term --gay this is a test

【编者注:如果想查看更多的控制码,可以 man console_codes

shell动画的更多相关文章

  1. shell脚本动画小工具

    shell脚本动画小工具 看gif图: shell脚本版 脚本内容如下: #!/usr/bin/env bash ## ---------------------------------------- ...

  2. shell二位数组——终端字符下降动画

    猜想:Shell支持关联数组,可以利用关联数组模拟二维数组. [验证猜想] #!/bin/bash array[1,1]=1 array[2,1]=2 array[3,1]=3 for i in `s ...

  3. Win10 UI动画

    <Button Content="Ship via Wells, Fargo & Co." HorizontalAlignment="Center" ...

  4. 全新 Mac 安装指南(编程篇)(环境变量、Shell 终端、SSH 远程连接)

    注:本文专门用于指导对计算机编程与设计(尤其是互联网产品开发与设计)感兴趣的 Mac 新用户,如何在 Mac OS X 系统上配置开发与上网环境,另有<全新 Mac 安装指南(通用篇)>作 ...

  5. 用HTML5实现的各种排序算法的动画比较 及算法小结

    用HTML5实现的各种排序算法的动画比较 http://www.webhek.com/misc/comparison-sort/ 几种排序算法效率的比较 来源:http://blog.chinauni ...

  6. Android 开机动画启动过程详解

    Android 开机会出现3个画面: 1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片): 2. Android平台启动初始化,出 ...

  7. [记录]Ubuntu下,使用Shell,简单替换有规律的文件名称

    因工作中需要将Flash转为Html5,并且要有动画效果,我将Flash的组件导出Png序列,然后将Png序列拼接成一张雪碧图(Sprite),名字为在生成雪碧图可以排序,需要改成数字名称. 而名字是 ...

  8. [转]Windows Shell 编程 第三章 【转自:http://blog.csdn.net/wangqiulin123456/article/details/7987901】

    第三章 操作文件 我依然清楚地记得,Windows95 的贝塔版出现的情形,它在朋友之间和学院中传播,好酷,全新的文件管理器,一种全图标,全彩色可客户化的界面,以及活泼的动画标识使得在文件拷贝和删除方 ...

  9. [转]Windows Shell 编程 第九章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987969】

    第九章 图标与Windows任务条 如果问一个非程序人员Windows最好的特色是什么,得到的答案应该是系统最有吸引力的图标.无论是Windows98现在支持的通用串行总线(USB)还是WDM(看上去 ...

随机推荐

  1. 删除rabbitmq中持久化的队列和数据

    在windows中的rabbitmq安装目录中的/sbin目录下: rabbitmqctl.bat stop_app rabbitmqctl.bat reset rabbitmqctl start_a ...

  2. SpringBoot (六) :如何优雅的使用 mybatis

    原文出处: 纯洁的微笑 这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关 ...

  3. 这年头不会点Git真不行!!!

    版本控制 说到版本控制,脑海里总会浮现大学毕业是写毕业论文的场景,你电脑上的毕业论文一定出现过这番景象! 1 2 3 4 5 6 7 8 9 10 11 毕业论文_初稿.doc 毕业论文_修改1.do ...

  4. 51nod 1171 大灾变

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1757 二分答案mid 避难所拆为mid个点 每个避难所的第一个点向第二个 ...

  5. HDU 1695 容斥

    又是求gcd=k的题,稍微有点不同的是,(i,j)有偏序关系,直接分块好像会出现问题,还好数据规模很小,直接暴力求就行了. /** @Date : 2017-09-15 18:21:35 * @Fil ...

  6. Flex布局(伸缩盒布局)

    Flexible Box是什么?Flexible意为可伸缩的,Box意为盒子,可以理解为一种新式的盒模型——伸缩盒模型.由CSS3规范提出,这是在原有的大家非常熟悉的block, inline-blo ...

  7. 【BZOJ】1951[Sdoi2010]古代猪文

    [题意]给定G,N,求: $$ans=G^{\sum_{i|n}\binom{n}{i}}\ \mod\ \ p$$ 1<=N,G<=10^9,p=999911659. [算法]欧拉定理+ ...

  8. hihoCoder 1174 : 拓扑排序·一

    题目链接:http://hihocoder.com/problemset/problem/1174 题目是中文题面我就不说题意了,要看题面的请点击上方链接~ 代码实现如下: #include < ...

  9. 快速幂取模_C++

    一.题目背景 已知底数a,指数b,取模值mo 求ans = ab % mo 二.朴素算法(已知可跳过) ans = 1,循环从 i 到 b ,每次将 ans = ans * a % mo 时间复杂度O ...

  10. 41、用Python实现一个二分查找的函数

    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] def binary_search(dataset ...