• Andorid源码编译需要掌握的shell语法(三)


    1. 前言

            最近在学习Android源码编译原理,涉及到MakeFile, Shell, Go语法,为了能看懂脚本文件,最快的掌握方法:一边看编译文件,一边学习语法规则,本篇文章记录的是关于Shell语法。Android编译工程涉及的基础知识杂广多,基础技能不扎实就好好补吧,记录下来。

             如果不了解shell语法的,请移步前两篇文章:

            Shell语法(一)_broadview_java的博客-CSDN博客

            Shell语法(二)_broadview_java的博客-CSDN博客

    2. 编译文件中语法记录

    2.1 local语法

    作用:一般用于shell内局部变量的定义,多使用在函数内部

    关于局部变量和全局变量:
    (1)shell 脚本中定义的变量是global的,作用域从被定义的地方开始,一直到shell结束或者被显示删除的地方为止。
    (2)shell函数定义的变量也是global的,其作用域从 函数被调用执行变量的地方 开始,到shell或结束或者显示删除为止。函数定义的变量可以是local的,其作用域局限于函数内部。但是函数的参数是local的。
    (3)如果局部变量和全局变量名字相同,那么在这个函数内部,会使用局部变量。

       local 定义的变量一般是在函数中使用

    2.2 date语法

    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"`

    2.3 tput语法

            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不可见
    前景色背景色颜色
    3040黑色
    3141红色
    3242绿色
    3343黃色
    3444蓝色
    3545紫红色
    3646青蓝色
    3747白色

    2.4  wildcard语法

            当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) 

            

            

            

  • 相关阅读:
    LeetCode 143.重排链表
    Python---多态
    数据库pymsql之使用简单登陆注册功能实现
    DVWA之SQL注入
    机械转码日记【23】模板进阶
    5分钟理解什么是卷积的特征提取
    SIGPIPE 原因和解决办法
    Linux基础指令
    比 N 小的最大质数
    Java测试框架:分享常用的Java测试框架,如JUnit, TestNG等,包括单元测试,集成测试,性能测试等
  • 原文地址:https://blog.csdn.net/u012514113/article/details/125848510