文件嵌入 Shell 脚本

把文件存入 Shell 脚本

在给别人发送自己写的脚本时,需要把其用到的其他文件一并发送过去。这时候就要使用 tar 进行打包。如果能将文件直接嵌入 Shell 脚本中,在第一次运行脚本的时候自动将文件释放出来,就能只发送一个脚本文件,而不再需要打包解包的操作。本文简述如何操作


获取文件的 Base64 编码

何为 Base64 编码

Base64(基底64)是一种基于64个可打印字符来表示二进制数据的表示方法。由于 $log_2 ⁡64=6$,所以每6个比特为一个单元,对应某个可打印字符。3个字节相当于24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。在Base64中的可打印字符包括字母A-Za-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。

—— Wikipedia

因为每 3 字节使用了 4 个可打印字符表示,所以导出的 Base64 编码一般都会比原本的文件更大

Shell 获取文件的 Base64编码

1
base64 -w 0 file > file.bs64

-w 0 参数使得该命令的输出不会自动换行,方便在 Shell 脚本中粘贴。

将文件的 Base64 编码保存到文件,方便复制粘贴。(下文假设获取到的 Base64 编码为 XXXX)

将文件的 Base64 编码输入脚本

1
2
3
4
file_bs64=$(cat << 'EOF'
XXXX # file 的 Base64 编码
EOF
)

至此已经完成了将文件嵌入脚本的操作

运行时解包

检测文件是否存在,如果不存在就将 Base64 解码存入文件

1
2
3
4
5
6
fn=file
if [ -f $(fn) ]; then
echo "Model found!"
else
echo "${file_bs64}" | base64 -d > $(fn)
fi