Bash中的字节数组(可能包含特殊字符)

时间:2016-10-05 04:44:07

标签: arrays bash base64

使用Bash中的base64解码消息(可能包含特殊字符)。保存到文件将产生48个字节的数据。然而,如果将它传递给变量,它就变成了41个字节的字符串。我相信这是由Bash处理特殊字符(^ @)的方式引起的。

举个例子,

meow_bash=`printf $variable | base64 --decode`
echo ${#meow_bash}  # return 41

printf $variable | base64 --decode > meow
wc -c meow # return 48

现在,如果由于数据的敏感性,我不想将数组保存到文件中。我还需要使用shell脚本来完成它。有没有办法让我使用bash / sh成功传递它?

1 个答案:

答案 0 :(得分:4)

请学习引用您的扩展:使用printf "$variable",而不是 printf $variable

最简单的原因是c将变量定义为以零字节结尾 因此,c字符串不能包含零字节 Bash(用c编写),默默地删除变量中的任何零值。

但是可以在流(管道等)中使用零字节。

简单的解决方法是不在变量内存储值(解码后)。

另请注意,当以base64编码存储时,变量可能包含任何字节值。

因此,可以为变量分配安全 base64编码值:

使用管道中的变量值擦除无字节:

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2"
$ printf '%s' "$variable" | base64 --decode | wc -c
18

即:流可以包含零值字节。

但是将解码后的值分配给变量:

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2"
$ meow_bash="$(printf '%s' "$variable" | base64 --decode)"
$ printf '%s' "$meow_bash" | wc -c
15
$ echo "${#meow_bash}"
15

变量$meow_bash丢失了3个零字节。