在bash中将二进制文件读入变量

问题描述 投票:1回答:1

我有以下bash脚本。我希望文件out.1和out.2是相同的,但它们是不同的。我怀疑问题是bash如何处理二进制文件。那么在bash中将二进制文件读入变量的正确方法是什么?

curl -s http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt > out.1
A=`curl -s http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt`
echo "$A" >  out.2
diff out.1 out.2
bash binaryfiles
1个回答
1
投票

bash变量(和环境变量,以及unix参数和...)不是二进制安全的。最大的问题是它们不能包含零字节(即ASCII NUL字符),因为它是一个字符串终止符。在某些情况下,最后删除/添加换行也存在问题,并且某些版本的echo将反斜杠字符视为需要解释的转义符。基本上,答案是:不要尝试在shell中存储二进制数据。

但是您可以将数据转换为非二进制格式(十六进制,base64,uuencode,无论如何),以及以该形式存储,传递等数据。请务必在适当的地方转换格式。以下是使用base64的示例:

$ curl -s http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt > out.1
$ a=$(curl -s http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt | base64)
$ echo "$a" | base64 -d >out.2
$ diff -s out.*
Files out.1 and out.2 are identical

顺便说一句,我建议使用低级或混合大小写的变量名称(有一堆具有特殊含义的全大写变量,并且偶然使用其中一个可能会产生奇怪的效果),并且还使用$( )而不是反引号(更容易阅读,并避免一些模糊的句法奇怪)。

© www.soinside.com 2019 - 2024. All rights reserved.