用base64从Bash解码消息(可能包含特殊字符)。保存到文件将产生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成功通过它?
请学会引用您的扩展:使用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个零字节。