秒表怎么用(秒表怎么读数)

秒表怎么用(秒表怎么读数)序言 相信读者对秒表都很熟悉。智能手机一般都有这样一个软件。 来自我的小米手机的截图截图来自我的小米手机 有一天,我突发奇想,想“复制”一个秒表程序的命令行版本——主要是尝试新学到的“原地更新”的技…

大家好,我是讯享网,很高兴认识大家。

序言

相信读者对秒表都很熟悉。智能手机一般都有这样一个软件。

来自我的小米手机的截图截图来自我的小米手机

有一天,我突发奇想,想“复制”一个秒表程序的命令行版本——主要是尝试新学到的“原地更新”的技巧,而不是一行一行地输出。程序的运行效果如下

那么这是怎么做到的呢?

实现思路及代码如何获取流逝的时间长度?

要实现一个秒表,你必须首先知道从计时器开始计时到现在有多长时间。在*nix系统中,表示时间的事实标准是Epoch Time[1],可以使用date命令在shell脚本中获取Epoch Time。减去第一个和最后一个时刻,得到这段时间内经过的秒数。示例代码如下

begin _ at = $(date & # 39;+% s & # 39;)#睡一觉end _ at = $(date & # 39;+% s & # 39;)((interval=${end_at}-${begin_at}))双括号是在shell脚本中执行算术运算的语法。其他语法可以在Shell脚本的Math中找到[2]。

如何换算为时分秒?

有了存储在interval中的总秒数,很容易将它们转换成分和秒。示例代码如下

((hours = $ { interval }/3600))((minutes =($ { interval } % 3600)/60))((seconds =($ { interval } % 3600)% 60))如何输出hh:mm:ss这样的格式?Hh:mm:ss表示分别用两位十进制数字显示小时、分钟和秒,并用冒号分隔。如果任何单位的值小于10,则用字符0填充左侧空白色。按照这种格式,凌晨1: 2: 3会显示为01:02:03。

要在命令行上打印一个字符串,echo命令是最容易想到的一个,但遗憾的是它不能轻松满足填充字符0的要求。

袖手旁观其他人也不是不可能。示例代码如下

小时= 1分钟= 2秒= 3 if[& # 34;$ { hours } & # 34-lt & # 39;10′];thene CHO-n & # 34;0 $ { hours } & # 34埃尔西科-n & # 34;$ { hours } & # 34菲乔-诺& # 39;:’如果[& # 34;$ { minutes } & # 34-lt & # 39;10′];thene CHO-n & # 34;0 $ {分钟} & # 34;埃尔西科-n & # 34;$ { minutes } & # 34菲乔-诺& # 39;:’如果[& # 34;$ { seconds } & # 34-lt & # 39;10′];thene CHO-n & # 34;0 $ {秒} & # 34;埃尔西科-n & # 34;$ { seconds } & # 34fi更优雅的方法是使用printf命令自动填充左边的字符0。

printf & # 34% 02d:% 02d:% 02d & # 34;$ { hours } $ { minutes } $ { seconds } printf命令类似于C语言中的printf函数——它也支持打印转义字符,下面会提到。

如何覆盖已经打印的内容?

从今年开始,我断断续续地看《构建你自己的文本编辑器》[3][3],学习如何开发一个文本编辑器。在本手册的第三章[4]中,作者讲述了如何使用终端的转义序列来控制屏幕上显示的内容——这正是秒表程序所需要的。

比如在终端输出转义序列\x1b[2J can clear 空 screen,效果如下

为了覆盖打印的分钟和秒钟,您需要:

先将光标移动到行首;再清除从光标开始到行末的内容。

你可以从VT100用户指南第3 [5]章了解。

要把光标移动到行首可以用转义序列\x1b[8D。之所以是 8,是因为按照hh:mm:ss输出时分秒后光标距离行首 8 个身位;要清除光标到行末内容可以用转义序列\x1b[0K(实际上,将光标移到行首只需要使用回车(carriage return)即可,但它被解释为开启新的一行了)。

更优雅的方法甚至不需要转义序列,只需使用tput命令。示例代码如下

回声-n & # 39;11:22:33’tputcrtputelecho & # 3944:55:66’对于cr和el,以及更多可以传递给tput命令的参数,请参考terminfo的man文档。

如何每隔一秒钟输出一次?

这大概是整个流程中最简单的要求。

当[1-eq1]在这里做#时,你可以做任何你想做的事情。完整的秒表可以在这一点上实现,完整的秒表程序可以实现。

#!/bin/bash#秒表,以hh:mm:ss格式显示数据begin _ at = $(date & # 39;+% s & # 39;)而[1-eq1]doend _ at = $(date & # 39;+% s & # 39;)#算术运算:http://faculty.salina.k-state.edu/tim/unix _ SG/bash/math . html((interval = $ { end _ at }-$ { begin _ at })((hours = $ { interval }/30)% 3600)/60))((seconds =($ { interval } % 3600)% 60))tputctputelprintf & # 34;% 02d:% 02d:% 02d & # 34;跑步后完成$ { hours } $ { minutes } $ { seconds } Sleep 0.5的效果如本文开头的GIF所示。

全文。

参考资料

[1]

纪元时间:https://en.wikipedia.org/wiki/Unix_time

[2]

Shell脚本中的数学:http://faculty . salina . k-state . edu/Tim/UNIX _ SG/bash/math . html

[3]

建立自己的文本编辑器:https://viewsourcecode.org/snaptoken/kilo/index.html

[4]

第3章:https://view source code . org/snap token/kilo/03 . rawinputoutput . html #清空屏幕

[5]

VT100用户指南第3章:https://vt100.net/docs/vt100-ug/chapter3.html

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/9466.html
(0)
上一篇 2024年 3月 21日 14:40
下一篇 2024年 3月 21日 15:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注