为什么用shell脚本?
因为可以把我们多个软件安装部署等一系列操作都汇聚到一个执行脚本中。 方便日后无需重复处理以上操作。

脚本与安装包再次形成一个脚本

脚本与安装包再次形成一个脚本。让多个文件在交付等场景下一个脚本文件包含所有,简单快捷,且不容易出错。
但如何做到呢?

原理

  1. 把安装脚本 与 软件压缩包内容都集成在一个脚本文件中。
  2. 在执行这个集成脚本时,会自动分离出压缩脚本,进行解压,安装。

实现脚本

举例: install.runxxx软件.zip

install.run 内容:本质就是通过标识计算出当前所在行,分离出脚本与安装压缩包

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
#!/bin/bash

main()
{
#获取当前目录
CDIR=`pwd`

#获取__ARCHIVE_BELOW__的下一行的行数放在ARCHIVE变量上,即install.tar.gz数据的开始行
ARCHIVE=$(awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0;}' $0)

#------ tar.gz 自解压处理方式 -------
#定位到行尾,即xxxx.tar.gz数据的开始行到行尾的完整数据,然后通过管道传给tar进行解压到临时目录
#tail -n+$ARCHIVE $0 | tar xzv -C $CDIR
#----- tar.gz -----

#------ zip 自解压处理方式 -------
#创建一个临时目录与文件,用于存放分离出来的压缩文件
export TMPDIR=`mktemp -d /tmp/tmp.XXXXXX`
chmod 777 $TMPDIR
TMPFILE=$TMPDIR/kkfileview.zip
touch $TMPFILE
chmod 777 $TMPFILE
#分离出压缩数据写到临时文件内
tail -n+$ARCHIVE $0 > $TMPFILE
#解压文件
unzip -d $CDIR $TMPFILE
#删除临时压缩文件
rm -r $TMPDIR
#----- zip -----


#进入到解压目录并对执行给予权限,再执行程序
#解压后的文件必须包含 install.sh(程序部署),否则会执行失败
cd $CDIR/解压后文件夹名称[如果没有可以不填] && chmod 777 install.sh

./install.sh

exit 0
}
main

# This line must be the last line of the file
# 而且需要换行,有的编辑器会将最后空白行干掉,导致报错(gzip: stdin: not in gzip format)
__ARCHIVE_BELOW__
1
2
#读取 install.run 与 xxx软件.zip 写入到新文件  install.sh
cat install.run xxx软件.zip > install.sh

后面只需要执行 install.sh 文件即可执行 install.run 同时处理 xxx软件.zip 对其解压,完成相关指令安装。

注意点

  1. 在windows直接又文件修改成.sh文件,在liunx服务器都会由于编码问题脚本报错
  2. .sh文件都需要一定的权限才能执行,需执行 chmod 755 xx.sh 类似权限命令
  3. 执行.sh文件,直接输入sh文件是无法执行的,需前面加入 ./ 明确是当前目录下sh脚本