shell脚本笔记(一)

最近在完善Jenkins上的自动构建系统时,一边探索一边学习到了一些shell脚本的内容,记录如下,操作系统是OSX。

执行子脚本

在一个脚本中调用另一个脚本,有几种方式,各自有各自的应用场景,以下分别介绍。

source

调用一个子脚本,执行完子脚本之后返回继续执行主脚本,同时将子脚本中的变量带回主脚本。

实际上这对于多渠道打包非常适用。先在主脚本中定义一些打包构建参数,全部是默认值,并将一些渠道用到的非默认值放进对应的脚本中,执行渠道脚本后会覆盖掉主脚本中的默认值。以下是一个示例:

主脚本build.sh,子脚本位于文件夹flavors中名为Android_QK.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 默认配置
name=SomeGameName
language=CN
useSomeSDK=false

platform=$1
flavor=$2

# 执行子脚本
source ./flavor/${platform}_${flavor}.sh

# 输出所有构建参数
echo platform=$platform
echo flavor=$flavor
echo name=$name
echo language=$language
echo useSomeSDK=$useSomeSDK

exec

执行一个子脚本,同时主脚本不再继续执行。

与前边的source完全不同,开始执行子脚本的时候,就意味着原来的主脚本结束了。

.

执行一个子脚本,待子脚本执行结束后,继续执行主脚本。

用于在主脚本中调用一系列的脚本,将各个阶段的代码拆分到不同的文件中,从而对于不同的构建类型可以更灵活地选择调用,例如更新资源可以这样:

1
2
3
4
5
# ...
./buildBundle.sh
./uploadToServer.sh
./refreshCDN.sh
# ...

打包时:

1
2
3
4
# ...
./buildBundle.sh
./buildPackage.sh
# ...

异步执行

在执行的命令后边跟一个&,即可异步执行。在主脚本后边加一句wait,会使所有异步执行的子脚本完全结束之后再返回继续执行主脚本。

在构建资源时,常常需要同时构建iOS和Android两个平台的,会出现类似这样的脚本内容:

1
2
3
# ...
./buildBundle.sh iOS
./buildBundle.sh Android

可是等一个打完再打另一个实在是太低效了,异步调用子脚本,两个平台一起打包,可以改为这样:

1
2
3
4
# ...
./buildBundle.sh iOS &
./buildBundle.sh Android &
wait

REFERENCE