shell编译脚本常见写法

本文主要总结自己在开发过程中遇到的编译使用的shell脚本的高频使用方法。
一般一个编译脚本都有如下几个过程。
1)获取当前脚本目录,后续脚本都基于当前目录来处理,便于移植,使用者将整个目录拷贝后就可以在任意位置使用。
2)加载一些公共脚本,进行初始化或者公共函数定义。一个大工程中,编译过程通常需要多个脚本完成,提取相同函数放入一个公共脚本,以减少代码冗余。
3)脚本入参获取。通常执行脚本可以带一些选项,常见的比如编译脚本的一些编译控制选项。
4)针对不同情况做分支处理,常用的就是 if 的条件判断语句。
5)一些可复用的函数

下面分别对上述过程实现方法做详细介绍:
1、目录获取

#方式一
SRC_DIR=${realpath "${dirname "${BASH_SOURCE[0]}"}"}
#方式二
DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" && pwd);
  • BASH_SOURCE[0]表示当前脚本名带相对路径,与BASH_SOURCE效果相同。
    ${BASH_SOURCE[0]}是${cmd}的形式,表示将cmd命令执行后的结果,与dirname组成一个新命令并执行。dirname是获取当前文件所在的文件夹路径(dirname命令去除文件名中的非目录部分),所以$(dirname “${BASH_SOURCE[0]}”)表示当前脚本所在的文件夹路径。
    realpath就可以将当前路径转化为绝对路径。
  • 方式二中 && 只有当左边执行成功才执行右边,所有先cd到当前目录,然后pwd显示当前绝对路径

2、在shell脚本中执行其他脚本

#方式一
source $SCRIPT_PATH/android-build-common.sh
. $SCRIPT_PATH/android-build-common.sh
#方式二
bash $SCRIPT_PATH/android-build-common.sh
sh $SCRIPT_PATH/android-build-common.sh
./$SCRIPT_PATH/android-build-common.sh
  • source+filename
    表示在本shell进程中执行该脚本,相当于直接把新脚本的代码拷贝到原脚本处并执行,该filename文件可以无“执行权限”。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。“.”方式与source 相同。
  • bash/sh filename
    重新建立一个子shell进程并执行脚本,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。该filename文件可以无“执行权限”。“./filename”与bash/sh 相同。
    注意如果filename不是以 #!/bin/bash 开头,那么也不会在子进程中执行。

3、脚本(函数)入参获取

#!/bin/bash
#举例
while [[ $# > 0 ]]
do
	key="$1"
	case $key in
		--freerdp-src)
			SRC_DIR="$2"
			shift
			;;
		--jpeg)
			WITH_JPEG=1
			shift
			;;
		--openh264)
			WITH_OPENH264=1
			shift
			;;
		*)
			REMAINING="$REMAINING $key"
			shift
			;;
	esac
done
  • $+特殊字符 用法
变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数。但是当它们被双引号(" “)包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … n " 的 形 式 输 出 所 有 参 数 ; " n"的形式输出所有参数;" n""@" 会将各个参数分开,以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数。

  • shift 用法
    位置参数可以用shift命令左移,shift 命令每执行一次,变量的个数($#)减一,而变量值提前一位
  • case 用法
    注意 “–freerdp-src” 是作为一个整体
    *) 表示未匹配到上述情况时则执行该语句,类似C语言switch-case里的default
    ;; 双分号相当于C语言里的break

4、if 条件语句

if [ -z $BUILD_ARCH ]; then
	BUILD_ARCH="armeabi-v7a x86 x86_64 arm64-v8a"
fi

if 括号中的各种条件语句含义 可参考此文档

5、常用函数–执行命令
将执行的重要shell命令采用函数形式,打印出命令语句及返回错误结果,便于调试与定位。

function common_run {
	echo "[RUN] $@"
	"$@"
	RES=$?
	if [[ $RES -ne 0 ]];
	then
		echo "[ERROR] $@ retured $RES"
		exit 1
	fi
}

举例

common_run cd $BASE
common_run export CMAKE_PROGRAM=/usr/bin/cmake
common_run cmake --build . --target install

你可能感兴趣的:(Linux,shell,linux,bash)