这是分析envsetup.sh的第一篇。自己对于shell脚本是一知半解,想借此了解更多。
方式是选取部分代码并记录自己的理解。
1.
local TOPFILE=build/make/core/envsetup.mk
local用来声明在函数内部的局部变量(local的用法可能不止这个)
注意声明语句中等号的左右不能有空格,不像其他的编程语句
因为 bash 和其他语言的不同点在于,bash 可以在脚本中直接运行命令,而且其中空格最重要的作用就是将参数列表中的参数区分开。
2.
if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then
。。。
else
。。。
fi
shell语句的if then的格式
-n 检测字符串长度是否不为 0,不为 0 返回 true。44
-a 同and,也就是逻辑与
-f 该文件名是否存在且为文件
逻辑为:TOP变量有值且"$TOP/$TOPFILE"路径存在文件
3.
PWD= /bin/pwd
注意等号右边有空格,区别于PWD=/bin/pwd,意思是为执行/bin/pwd前先把PWD变量赋值为空字符串,这个“PWD变量赋值为空字符串”仅在执行/bin/pwd是有效的,执行结束PWD的值为赋值前的值
/bin/pwd执行了就会打印当前目录
4.
while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
\cd ..
T=`PWD= /bin/pwd -P`
done
while do的格式
逻辑表达式中的“(”,“)”都带有转义,这个转义是必须加的
cd命令前的转义似乎不是必须的,去除也可以执行
/bin/pwd -P 多了-P的参数,-P表示实际物理路径而非软链接路径,在软连接地址测试下来/bin/pwd同样表示实际物理地址
`PWD= /bin/pwd -P` 反引号引用的直接执行,然后以打印值返回
逻辑为:当定位的路径不存在文件且不是根目录“/”时,进入父目录并将进入后的当前目录赋值给T变量
5.
local T=$(gettop)
envsetup.sh中其他函数调用gettop,经常有这种写法,这种写法会去执行gettop,然后以打印值作为返回,赋值给T
整体函数逻辑说明:
1.gettop获取Android项目的根目录,根据“build/make/core/envsetup.mk”这个路径去定位
备注:
只是用来记录自己的理解,其中一些措辞可能比较不专业。