【安卓笔记】安卓13编译系统大包选择脚本的shell编程代码解读,巩固shell编程的知识

本文主要是介绍【安卓笔记】安卓13编译系统大包选择脚本的shell编程代码解读,巩固shell编程的知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、local a

创建一个局部变量a,作用在function内。export:Shell的export命令用于将变量声明为全局变量,使其在子进程中可用。

在Shell中,可以使用export命令将变量或环境变量声明为全局变量,以便在子进程中访问。例如,以下命令将变量"VAR"声明为全局变量:export VAR=value

2、echo

该命令一般是输出字符串到界面,echo -e “字符串”,-e命令可以在“”里面使用转义斜杠\。echo -n ""可以输出字符串后不换行。

3、read hdmi_out_answer

read命令用于从键盘读取用户输入的值,并将该值赋值给hdmi_out_answer这个变量,可以使用美元符引用该变量:$hdmi_out_answer。

4、shell编程的if语句
	if [  ! -n "$parameter" ];thenselect_selinux_modeelseif [ $parameter = "1" ];then#安装google GMS package selinux必须为Permissive!sed -i 's/PRODUCT_SELINUX_AUTHORITY=0/`PRODUCT_SELINUX_AUTHORITY=1`/g' $selinux_authority_pathecho -e "Note:You have select \033[32mPermissive\033[0m !"elif [ $parameter = "0" ];thenselect_selinux_modefifi

解读:第一个if 里面的 ! -n 是判空语句,用来判断parameter参数是否为空,-n 表示非空,-n 前面有个!,表示非空的否定,即如果parameter为空,则if条件成立,执行then里面的内容,否则执行else后面的内容;sed -i是用于直接修改文件内容的选项,可以用于替换文件中的文本或对文件进行其他转换操作,在这里是将文件中所有的字符串PRODUCT_SELINUX_AUTHORITY=0替换成PRODUCT_SELINUX_AUTHORITY=1。fi用来结束一个if语句。

5、case语句
		case $selinux_authority_answer in0)sed -i 's/PRODUCT_SELINUX_AUTHORITY=1/PRODUCT_SELINUX_AUTHORITY=0/g' $selinux_authority_pathecho -e "Note:You have select \033[32mEnforcing\033[0m !";;1)sed -i 's/PRODUCT_SELINUX_AUTHORITY=0/PRODUCT_SELINUX_AUTHORITY=1/g' $selinux_authority_pathecho -e "Note:You have select \033[32mPermissive\033[0m !";;*)sed -i 's/PRODUCT_SELINUX_AUTHORITY=0/PRODUCT_SELINUX_AUTHORITY=1/g' $selinux_authority_pathecho -e "Note:You have select \033[32mPermissive\033[0m !";;esac

当用户未输入时,可以使用*执行默认选择的操作。
与其他语言不一样,例如Java的case如下:

        switch (num) {case 3:System.out.println("恭喜你,获得三等奖! !! ");break;case 2:System.out.println("恭喜你,获得二等奖! !! ");break;case 1:System.out.println("恭喜你,获得一等奖! !! !! ");break;default:System.out.println("很遗憾,未中奖!");}
6、shell的函数

shell方法定义有点类似Javascript里面的方法

function select_powermode() {
#方法体
}

可以在方法里面写一些与用户打交道的,比如提示用户输入,获取用户输入

function select_powermode() {
#方法体local skg_device_path=./ebsw_skg/skg/device/skg_mk/skg_device.mklocal upgrade_ini_path=./ebsw_skg/skg/device/amlogic/t982_ar301/skg/skg_upgrade_cfg.ini echo -e "Please Select 上电模式 :"echo -e "\033[33m	0.上电开机\033[0m"echo -e "\033[33m	1.上电待机\033[0m"echo -e "\033[33m	2.记忆模式\033[0m"echo -n "Please input your select(If not selected, the definition 上电开机):"read powermode_answer
}

然后根据 用户的输入,在if语句里对不同的输入做相应的处理。

7、带颜色输出
function echoWithColor() {echo -e "\033[${2}m${1} \033[0m"
}

函数中的echo -e命令用于在终端输出文本。-e选项是使echo解析并解释后面的转义字符。\033[${2}m 是设置颜色的转义序列。\033是ESC字符,[${2}m是一个由索引颜色编码表示的颜色代码。索引颜色编码由一个以"0"到"99"的数字表示,其中"0"代表黑色,"1"代表红色,"2"代表绿色,"3"代表黄色,"4"代表蓝色,"5"代表洋红色,"6"代表青色,"7"代表白色。这个颜色代码会被${2}变量替换,所以你可以在调用函数时指定颜色。

${1} 是你要输出的文本,它会被设置成前面指定的颜色。

\033[0m 是重置颜色的转义序列,它会把颜色设置回默认颜色。这个序列被放在文本后面,这样在输出下一行命令之前,颜色会恢复到默认颜色。

8、复制文件
function copyfiles() {files_num=$(grep -0 file: $gfile -c)echo "Number of files: "$files_num >> cpfile.logfor i in $(seq 1 $files_num)dofile_indexes=$i.file;echo "file_indexes : "$i >> cpfile.log;file=$(grep -wn $file_indexes $gfile | cut -d : -f 3);target=$file;echo "file : "$file >> cpfile.log;first_line=$file_indexes:$filesrcpath=$(grep -xA 1 $first_line $gfile | grep -wA 1 $file_indexes $gfile | tail -1| cut -d : -f 2);echo "srcpath : "$srcpath >> cpfile.log;dtspath=$(grep -xA 3 $first_line $gfile | grep -wA 3 $file_indexes $gfile | tail -1 | cut -d : -f 2);echo "dtspath : "$dtspath >> cpfile.log;echo "file : "$file >> cpfile.log;if [ $srcpath == "null" ]; thenecho "Do not copy files" >> cpfile.log;elsecp -rvf $srcpath$file $dtspath >> cpfile.log;echo " " >> cpfile.logfidone
}

解读:第一行 files_num=$(grep -0 file: $gfile -c) 中,grep是一个搜索命令,用于在文本中搜索指定的模式。-0 是一个选项,意思是搜索整个文件名(而不是文件中的文本)。file: 是搜索的模式,意思是搜索文件名中包含 ‘file:’ 的文件。$gfile 是变量,表示你要搜索的文件或目录的路径。-c 是计数选项,表示只输出匹配的行数,也就是文件数。第二行输出文件数量到终端并将结果存到日志文件中。

循环语句:
1、for i in $(seq 1 $files_num):这是一个循环语句,用于迭代从1到$files_num(一个先前定义的变量,表示文件数量)的所有整数。

2、file=$(grep -wn $file_indexes $gfile | cut -d : -f 3);:这行使用grep命令查找$gfile中与file_indexes匹配的行,并使用cut命令以冒号(:)为分隔符提取第三部分(字段),将结果赋值给file变量。

3、srcpath=$(grep -xA 1 $first_line $gfile | grep -wA 1 $file_indexes $gfile | tail -1| cut -d : -f 2);:这行使用grep命令查找 g f i l e 中与 gfile中与 gfile中与first_line和$file_indexes匹配的行,并使用tail -1获取最后一个匹配行,再使用cut命令以冒号(:)为分隔符提取第二部分(字段),将结果赋值给srcpath变量。

4、dtspath=$(grep -xA 3 $first_line $gfile | grep -wA 3 $file_indexes $gfile | tail -1 | cut -d : -f 2);:这与上面的行类似,但使用的是不同的grep选项和参数,可能表示从不同的行开始/结束搜索,并将结果赋值给dtspath变量。

5、cp -rvf $srcpath$file $dtspath >> cpfile.log;:这行使用cp命令复制文件。选项 -rvf 分别表示递归复制,显示复制过程以及如果目标文件已存在则询问是否覆盖。

9、屏幕参数选择
function panel_select()
{iniPath="ebsw_skg/skg/device/amlogic/t982_ar301/skg/panel"local skg_path_panel=./ebsw_skg/skg/device/skg_mk/ebsw_device.mkif [ $1 = "skg" ] ; thenlet c=0;export select_pq="default"for ini in $(ls ${iniPath}); doif [ "${ini##*.}"x = "ini"x ] ;thenif [ "$ini" != "skg_panel_select.ini" ] ; thenif [ "$ini" != "skg_bootloader_info_config.ini" ] ; theniniNameArray[$c]=$inilet c++fififidoneecho " ------------------------------ "echoWithColor ">>>>>>>>> 屏参选择" 36echo "屏参位置: ${iniPath}"echo "默认屏参(不清楚使用哪个可使用默认,按空格跳过): vbyone_1region"for i in $(seq 0 ${#iniNameArray[@]}); doif [[ ! -z "${iniNameArray[$i]}" ]]; thenechoWithColor "	$i.${iniNameArray[$i]%*.ini}"  33fidoneread -p "请输入您所需要的屏参前的序号: " iptif [[ "$ipt" =~ ^[[:digit:]]+$ && ! -z "${iniNameArray[$ipt]}" ]]; thenselectedPanel=${iniNameArray[$ipt]%*.ini}if [[ $selectedPanel != "vbyone_1region" ]] && [[ $selectedPanel != "vbyone_2region" ]];thenselect_pq=$selectedPanelfielseechoWithColor "输入错误." 31echoWithColor "默认使用当前屏参. -> vbyone_1region" 31selectedPanel="vbyone_1region"fiecho -e "Note:You have select Panel is \033[32m " $selectedPanel "\033[0m !"elseexport select_pq="default"selectedPanel="vbyone_1region"fised -i "s/ro.skg.panel.name=.*/ro.skg.panel.name=${selectedPanel}/g" $skg_path_panelsed -i "s/panel_ini_name=.*$/panel_ini_name=${selectedPanel}.ini/g" ebsw_skg/skg/device/amlogic/t982_ar301/skg/panel/skg_panel_select.ini
}

解读:在for循环里面遍历面板配置文件,获取屏参的名称,并保存到数组iniNameArray中,if [[ ! -z "${iniNameArray[$i]}" ]];用来判断数组中的第i个元素是否为空。

在读取用户输入值之后,if [[ "$ipt" =~ ^[[:digit:]]+$ && ! -z "${iniNameArray[$ipt]}" ]]; then:这是一个条件判断。它首先检查用户输入的ipt是否只包含数字(1+是一个正则表达式,表示匹配一个或多个数字),然后再检查iniNameArray数组中对应索引的元素是否非空。如果这两个条件都满足,那么就执行下面的代码块。

接下来是赋值操作,:selectedPanel=${iniNameArray[$ipt]%*.ini}这行代码将iniNameArray数组中索引为ipt的元素的值赋给selectedPanel变量,然后使用%*.ini操作符去掉这个字符串的最后一个.ini。这可能是为了在处理文件名或者屏参名时去掉它们的后缀。

接下来就是把选择的屏参写入文件中

sed -i "s/ro.skg.panel.name=.*/ro.skg.panel.name=${selectedPanel}/g" $skg_path_panel
sed -i "s/panel_ini_name=.*$/panel_ini_name=${selectedPanel}.ini/g" ebsw_skg/skg/device/amlogic/t982_ar301/skg/panel/skg_panel_select.ini
10、脚本执行逻辑

脚本文件入口函数为select_customer(),在该函数里面,首先需要用户输入选择编译平台。

	echo -e "\n\n**************** ANDROID ******************"echo -e "Please Select Customer:"echo -e "\033[33m	0.T982_AML\033[0m"echo -e "\033[33m	1.T982_SKG\033[0m"echo -e "\033[33m	2.T982_SENSES\033[0m"echo -e "\033[33m	3.T982_GAOKE\033[0m"echo -e "\033[33m	4.T982_xxx\033[0m"echo -n "Please input your select:"read answer

,然后根据不同的平台需要,运行对应的函数,比如AML平台,需要运行屏参选择、pq选择、和aq选择函数。

		case $answer in0)echo -e "Note:You have select \033[32mT982_AML\033[0m !"panel_select "aml";		# 屏参选择pq_select;				# PQ跟随屏参aq_select;				# AQ数据选择# 开始拷贝文件echo "Select AML" > cpfile.log;Restore_files;echo $( date "+%Y_%m_%d %H:%M:%S" ) >> cpfile.log;# 拷贝结束;;

  1. [:digit:] ↩︎

这篇关于【安卓笔记】安卓13编译系统大包选择脚本的shell编程代码解读,巩固shell编程的知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/173137

相关文章

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

python3 gunicorn配置文件的用法解读

《python3gunicorn配置文件的用法解读》:本文主要介绍python3gunicorn配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python3 gunicorn配置文件配置文件服务启动、重启、关闭启动重启关闭总结python3 gun