在Shell脚本后嵌入文件

公司的项目中碰到过在Shell脚本嵌入文件形成自解压文件的情况,但是前面设计的方式太笨拙,还需要自己计算行号,于是查了一下资料改写了一版本比较通用的自解压文件。

结构

文件分析几个部分,可以在安装前、安装后进行准备和清理工作。前面的md5这个变量可以通过其它脚本自动生成,并拼接起一个完整的文件。自解压文件会首先对嵌入的文件进行md5校验,没有问题再解压执行,确保万无一失。

文件末尾的嵌入文件,可以使用echo的方式对之前拼接好的纯Shell脚本进行追加。

代码

#!/bin/bash
 
PATH=/usr/bin:/bin
umask 022
md5=0ee8c59a12d99fdfd1e95bfda6938e86
 
pre_install()
{
    echo "准备安装环境(略)..."
    mkdir ./install.tmp.$$
}
extract()
{
    echo "从脚本中提取文件"
    line_number=`awk '/^__BIN_FILE_BEGIN__/ {print NR + 1; exit 0; }' "$0"`
    tail -n +$line_number "$0" >./install.tmp.$$/extract.$$
    # tail -n +$line_number "$0" >./install.tmp.$$/extract_tmp.$$
    # base64 -d ./install.tmp.$$/extract_tmp.$$ >./install.tmp.$$/extract.$$
}
check_sum()
{
    if [ -x /usr/bin/md5sum ] && [ -f "install.tmp.$$/extract.$$" ]; then
        echo "正在检查md5......"
        sum_tmp=($(/usr/bin/md5sum install.tmp.$$/extract.$$))
        if [ $sum_tmp != $md5 ]; then
            echo "文件md5不一致,请检查文件完整性,退出!"
            exit 1
        fi
    else
        echo "找不到md5sum命令或文件未提取,退出"
        exit 1
    fi
}
install()
{
    echo "安装中(略)..."
}
post_install()
{
    echo "配置中(略)..."
    echo "清理临时文件"
    rm -rf install.tmp.$$
}
 
main()
{
    pre_install
    extract
    check_sum
    install
    post_install
    exit 0
}
 
main
 
__BIN_FILE_BEGIN__  #这行下面接二进制文件
# ......