125、【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
首先,这里还有个细节,之前 POSIX 标准描述了 if 条件语句的结构如下
可以看到这里的结构中,compoud-list 命令列表后面并没有分号,而方案中的 if compoud-list 后面,是有分号的
这里分号等价于换行,POSIX 标准用换行表示命令结束,可以看到在 POSIX 标准里面 if 条件语句的描述,compoud-list 后面虽然没有分号,但是 then 却换了一行,表示新命令的开始,所以这里用分号 ;
是为了把 then 放在和 if compoud-list 同一行,两者完全等价,只是写法不同
实际上,这种等价关系是个通用规则,Shell 解析器会把分号 ;
和换行等价处理,比如前面分析的 while do done 类型结构,也是一样
在 POSIX 规范对 While 循环的描述中
while compoud-list-1 后面也是先换行,再接 do 关键字的,而如果想把 then,do 等关键字和前面的 if,while 等命令放在同一行,就必须用分号 ;
分隔
下面有个简单的小实验,在终端中输入
if true
Bash 进入交互模式,等待用户输入更多信息
接着输入
then
继续等待
输入要执行的命令
echo "that is true"
提示继续输入
输入 fi
表示结束
fi
此时 Bash 终端中执行动作(因为条件判断是 true,恒为真),打印出 that is true
字符串
注意,这里交互的时候,全程没有输入分号 ;
,仅靠交互时的换行对命令进行分割,但是在终端查看之前输入的命令时,可以惊奇的发现,Shell 对前面输入的这么多命令,自动加上了分号 ;
进行分割,因为 Shell 要将这些命令都汇聚到一行以内显示出来,根据分号 ;
和换行等价规则,Shell 进行了等价替换
系统错误码
最后再分析下 if 条件语句中的另一个细节
这里描述当 compoud-list 命令执行返回 0 时,将执行 then 后面的 compoud-list 命令,在 POSIX 规范中,0 一般用来表示命令执行成功,这也是操作系统层面的一个通用约定,Advanced Bash-Scripting Guide 《高级 Bash 脚本编程指南》这里有总结
在 Bash 中,0 表示成功,其他数字表示错误原因,这也是为了和 C/C++ 标准保持一致
终端输入
cat /usr/include/sysexits.h
可以看到在系统层面的一些错误码
可以看到在操作系统,C 规范中,E_OK 也是 0,表示命令执行成功
ok,先到这里,下篇 blog 继续