127、【OS】【Nuttx】【周边】效果呈现方案解析:比较浮点数(上)
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
之前 blog
【OS】【Nuttx】【周边】效果呈现方案解析:测试命令
分析了测试命令和 if
表达式之间的联系,下面继续
回到这个比较点:
# 如果找到了文件if [ -n "$file_mtime" ]; then# 使用 awk 比较浮点数if awk "BEGIN {exit !($file_mtime > $max_mtime)}"; thenmax_mtime=$file_mtimelatest_dir=$dirfifi
之前 blog 【OS】【Nuttx】【周边】效果呈现方案解析:find 格式化打印 说过, file_mtime 变量拿到的是一个 Unix 时间戳(即自 1970-01-01 00:00:00 UTC 起的秒数,浮点数形式),比如在终端输入
find -printf "%T@\n"
可以打印当前目录下创建的文件和目录的日期(以 Unix 时间戳形式打印出来)
可以看到,这些数据都是浮点数形式
然后由于要获取最新修改的文件,这就涉及到在 Bash 中比较浮点数,下面来分析下
比较浮点数
首先,先看下上篇 blog 【OS】【Nuttx】【周边】效果呈现方案解析:测试命令 介绍的 test 命令,终端输入
man test
查看 test 命令描述,可以看到
test 命令描述中,仅支持正数类型进行比较,是不支持浮点数比较的,如果强行想用 test 命令比较浮点数,比如在终端输入
test_var1=1.1
test_var2=1.2
test $test_var1 -lt $test_var2
可以看到 test 命令直接报错,提示要输入整数类型
ok,下面来看 awk 命令,先简单介绍下
首先,awk 命令是一个强大的文本处理工具,可以用来
- 分析和提取文本内容
- 处理结构化数据(按一定格式组织起来的数据文件),比如日志文件,CSV 表格等
- 做简单的文本转换或计算
是 Unix 系统中三剑客之一(另外两个是 sed 和 grep),在 Shell 脚本中非常常用
awk 命名没啥特殊含义,只是三位创始人姓氏的首字母缩写:Alfred Aho,Peter Weinberger,Brian Kernighan,其中 Brian Kernighan 也是 C 语言经典书籍《The C Programming Language》的作者之一
其次,awk 不仅仅是一个命令行工具,实际上也是一种完整的编程语言:领域特定语言(Domain Specific Language,DSL),专门设计用来处理文本和数据,可以把 awk 看作是一种轻量级的数据处理语言,其融合了诸如
- 模式匹配(类似 grep)
- 自动处理输入和字段,比如逐行读取输入,自动按列分割等
- 可以定义变量,支持循环结构,条件判断,函数等(像传统编程语言)
- 内置函数(字符串、数学等)
- 支持关联数组(类似字典,哈希表等数据结构)
ok,awk 内容很多,下面回到所用到的地方
这里 BEGIN { ... }
是 awk 的一个特殊模式(也叫 pattern ),表示在 awk 命令开始读取任何输入文件之前,先执行一次 { } 里的代码
终端输入
man awk
可以查看 awk 相关的手册文档,输入 /^\s*BEGIN
可以匹配查找到 BEGIN
相关的语法如下:
从描述中,可以看到 awk 的核心工作方式是:逐行读取输入,对每一行执行 pattern 匹配的 action,这里的 pattern 可以是表达式 expression,也可以是 BEGIN 或者 END 这样的关键字
BEIGIN
:
比如有时候不想处理文件内容,只想做一些初始化(比如设置变量),或者计算一个表达式(比如现在这种比较两个浮点数的场景),这时候用 BEGIN 就可以告诉 awk 命令:不用等待输入文件,现在就执行花括号 { }
里的代码
对应的 END { ... }
:所有行处理完后,最后执行一次 END 里面的 action
所以综合这些概念,BEGIN 是处理开始前,END 是处理结束后
ok,先到这里吧,下篇 blog 继续