文章目录
  1. 1. 概述
  2. 2. 第一个版本
  3. 3. 第二个版本
  4. 4. 参考文章

概述

简单的说Shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用。

通常Shell脚本以.sh为后缀。如果要执行该脚本,必须先使其可执行

1
chmod +x filename

此后在该脚本所在目录下,输入./filename即可执行该脚本。

还有一种更简单的方法就是直接在终端用 sh 指令来执行。

1
sh filename

最近打包webRTC库时重复的工作和容易出错的机会让我想到了Shell脚本。基本需求就是把C++工程师那边的arm64、armv7、i386三个架构的zip包(webRTC静态库包的压缩文件)打成一个.a静态库。

下面就是这个过程中解决的两个版本。

第一个版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/sh
# arm64包的名称
arm64=Release-iphoneos
# armv7包的名称
armv7=Release-iphoneos
# i386包的名称
i386=Debug-iphonesimulator

# 解压缩该目录下的$arm64.zip文件到该目录下的$arm64文件夹下,不提示的情况下覆盖文件
unzip -o -d arm64/$arm64 arm64/$arm64
# 解压缩该目录下的$armv7.zip文件到该目录下的$armv7文件夹下,不提示的情况下覆盖文件
unzip -o -d armv7/$armv7 armv7/$armv7
# 解压缩该目录下的$i386.zip文件到该目录下的$i386文件夹下,不提示的情况下覆盖文件
unzip -o -d i386/$i386 i386/$i386
echo "解压缩成功"

# 将上面的两个静态库移到其上一个目录
mv arm64/$arm64/$arm64/$capture arm64/$arm64/$arm64/$render arm64/$arm64/
mv armv7/$armv7/$armv7/$capture armv7/$armv7/$armv7/$render armv7/$armv7/
mv i386/$i386/$i386/$capture i386/$i386/$i386/$render i386/$i386/
echo "成功移动两个特殊的静态库"

# 合并arm64/$arm64/$arm64/下所有*.a构建arm64为libWebRTC-arm64.a
libtool -static -o arm64/$arm64/libWebRTC-arm64.a arm64/$arm64/$arm64/*.a
# 合并armv7/$armv7/$armv7/下所有*.a构建armv7为libWebRTC-armv7.a
libtool -static -o armv7/$armv7/libWebRTC-armv7.a armv7/$armv7/$armv7/*.a
# 合并i386/$i386/$i386/下所有*.a构建i386为libWebRTC-i386.a
libtool -static -o i386/$i386/libWebRTC-i386.a i386/$i386/$i386/*.a
echo "成功构建libWebRTC-arm64.a、libWebRTC-armv7.a、libWebRTC-i386.a"

echo "正在执行最后的合成操作,请稍后..."

# 创建支持arm64、armv7、i386的libWebRTC
lipo -create arm64/$arm64/$capture armv7/$armv7/$capture i386/$i386/$capture -output libVideoCapture.a
lipo -create arm64/$arm64/$render armv7/$armv7/$render i386/$i386/$render -output libVideoRender.a
lipo -create arm64/$arm64/libWebRTC-arm64.a armv7/$armv7/libWebRTC-armv7.a i386/$i386/libWebRTC-i386.a -output libWebRTC.a
echo "成功创建支持arm64、armv7、i386的libWebRTC"

# 清理中间垃圾文件(把子目录及子目录中所有档案删除,并且不用一一确认)
rm -rf arm64/$arm64
rm -rf armv7/$armv7
rm -rf i386/$i386

第二个版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# arm64包的名称
arm64=Release-iphoneos
# armv7包的名称
armv7=Release-iphoneos
# i386包的名称
i386=Debug-iphonesimulator

tempArm64Path=arm64/$arm64
tempArmv7Path=armv7/$armv7
tempI386Path=i386/$i386
# 定义需要移动的两个静态库的别名
capture=libvideo_capture_module_internal_impl.a
render=libvideo_render_module_internal_impl.a

# 解压缩第一个参数下的zip文件到该目录下,不提示的情况覆盖文件
funUnzip(){
unzip -o -d ${1} ${1}
echo "解压缩${1}成功"
}

# 将上面的两个静态库移到其上一个目录
funMoveStatic(){
funUnzip ${1}

mv ${1}/${2}/$capture ${1}/${2}/$render ${1}
echo "成功移动${1}/${2}中两个特殊的静态库"
}

# 合并arm64/$arm64/$arm64/下所有*.a构建arm64为libWebRTC-arm64.a这种情况
funMergeStatic(){
funMoveStatic ${1} ${2}

libtool -static -o ${1}/libWebRTC-${3}.a ${1}/${2}/*.a
echo "成功构建libWebRTC-${3}.a"
}

funBuildWebRTC(){
funMergeStatic ${tempArm64Path} ${arm64} "arm64"
funMergeStatic ${tempArmv7Path} ${armv7} "armv7"
funMergeStatic ${tempI386Path} ${i386} "i386"

echo "正在执行最后的合成操作,请稍后..."

# 创建支持arm64、armv7、i386的libWebRTC
lipo -create ${tempArm64Path}/$capture ${tempArmv7Path}/$capture ${tempI386Path}/$capture -output libVideoCapture.a
lipo -create ${tempArm64Path}/$render ${tempArmv7Path}/$render ${tempI386Path}/$render -output libVideoRender.a
lipo -create ${tempArm64Path}/libWebRTC-arm64.a ${tempArmv7Path}/libWebRTC-armv7.a ${tempI386Path}/libWebRTC-i386.a -output libWebRTC.a
echo "成功创建支持arm64、armv7、i386的libWebRTC"

# 清理中间垃圾文件(把子目录及子目录中所有档案删除,并且不用一一确认)
rm -rf ${tempArm64Path}
rm -rf ${tempArmv7Path}
rm -rf ${tempI386Path}
}
funBuildWebRTC

参考文章

shell 命令

Linux Shell脚本教程:30分钟玩转Shell脚本编程

Shell常用招式大全之入门篇

文章目录
  1. 1. 概述
  2. 2. 第一个版本
  3. 3. 第二个版本
  4. 4. 参考文章