最近在学习Android源码编译原理,涉及到MakeFile, Shell, Go语法,为了能看懂脚本文件,最快的掌握方法:一边看编译文件,一边学习语法规则,本篇文章记录的是关于Shell语法。Android编译工程涉及的基础知识杂广多,基础技能不扎实就好好补吧,记录下来。
如果不了解shell语法的,请移步前两篇文章:
Shell语法(一)_broadview_java的博客-CSDN博客
Shell语法(二)_broadview_java的博客-CSDN博客
作用:一般用于shell内局部变量的定义,多使用在函数内部
关于局部变量和全局变量:
(1)shell 脚本中定义的变量是global的,作用域从被定义的地方开始,一直到shell结束或者被显示删除的地方为止。
(2)shell函数定义的变量也是global的,其作用域从 函数被调用执行变量的地方 开始,到shell或结束或者显示删除为止。函数定义的变量可以是local的,其作用域局限于函数内部。但是函数的参数是local的。
(3)如果局部变量和全局变量名字相同,那么在这个函数内部,会使用局部变量。
local 定义的变量一般是在函数中使用
date +"%Y%m%d" -d "+n days" #今天的后n天日期
date +"%Y%m%d" -d "-n days" #今天的前n天日期
date +"%F" #输出: 2012-06-08
date +"%D" #输出: 06/08/12
date +"%Y%m%d %H:%M:%S" #输出: 20120608 04:52:28
date +"%Y%m%d" #输出: 20120608
date +"%Y%m%d %H:%M:%S" -d "+1 hours" #输出: 20120608 05:52:43
date +"%Y%m%d %H:%M:%S" -d "+1 days" #输出: 20120609 04:52:52
date +"%Y%m%d %H:%M:%S" -d "+1 months" #输出: 20120708 04:52:56
date +"%Y%m%d %H:%M:%S" -d "+1 years" #输出: 20130608 04:53:07
date +"%T" #输出: 05:03:21
date +"%F %T" #输出: 2012-06-08 05:03:34
date +"%D %T" #输出: 06/08/12 05:03:39
# 字符串转时间戳
date -d "2010-10-18 00:00:00" +%s #输出:1287331200
# 时间戳转字符串
date -d @1287331200 "+%Y-%m-%d" #输出:2010-10-18
# 获取指定日期的后N天,如果是前N天,则第二部中间是 -
步骤1:得到时间戳 seconds=`date -d "2010-10-18 00:00:00" +%s`
步骤2:加上N天的秒数86400*N seconds_new=`expr $seconds + 86400*N`
步骤3:获得指定日前加上一天的日前 date_new=`date -d @$seconds_new "+%Y-%m-%d"`
tput 命令主要用于设置终端工作模式,或读出终端控制字符。tput 命令与终端控制代码数据库terminfo 相连, 根据Shell 环境变量TERM 的值, 读出这种终端的指定功能控制代码
2)tput : 改变终端显示特性,常见用法如下:
tput lines : 显示终端的行数
tput cols : 显示终端的列数
tput cup line_number collum_number : 定位光标到 line_number 行,collum_number 列的位置
tput setb n : 其中 n 为 0-7 的数字,设置终端的背景颜色
tput setf n : 其中 n 为 0-7 的数字,设置终端的前景色,即字体的颜色
tput sc : 保存光标的位置
tput rc : 恢复光标到上一次保存的位置
tput ed : 清空光标所在位置到屏幕结尾的所有内容
tput smul : 设置下划线
tput rmul : 移除下划线
tput bold : 设置文本样式为粗体
| 显示方式 | 意义 |
|---|---|
| 0 | 终端默认设置 |
| 1 | 高亮显示 |
| 4 | 使用下划线 |
| 5 | 闪烁 |
| 7 | 反白显示 |
| 8 | 不可见 |
| 前景色 | 背景色 | 颜色 |
|---|---|---|
| 30 | 40 | 黑色 |
| 31 | 41 | 红色 |
| 32 | 42 | 绿色 |
| 33 | 43 | 黃色 |
| 34 | 44 | 蓝色 |
| 35 | 45 | 紫红色 |
| 36 | 46 | 青蓝色 |
| 37 | 47 | 白色 |
当shell在“参数”中遇到了通配符时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。
总之,通配符 实际上就是一种shell实现的路径扩展功能。在通配符被处理后, shell会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。
shell常见通配符:
| 字符 | 含义 | 实例 |
| * | 匹配 0 或多个字符 | a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。 |
| ? | 匹配任意一个字符 | a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。 |
| [list] | 匹配 list 中的任意单一字符 | a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。 |
| [!list] | 匹配 除list 中的任意单一字符 | a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。 |
| [c1-c2] | 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] | a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b... a9b。 |
| {string1,string2,...} | 匹配 sring1 或 string2 (或更多)其一字符串 | a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一。 |
需要说明的是:通配符看起来有点象正则表达式语句,但是它与正则表达式不同的,不能相互混淆。把通配符理解为shell 特殊代号字符就可。而且涉及的只有,*,? [] ,{} 这几种。
例如:
SRC = $(wildcard *.c)
等于指定编译当前目录下所有.c文件
如果还有子目录,比如子目录为inc,则再增加一个wildcard函数,象这样:
SRC = $(wildcard *.c) $(wildcard inc/*.c)