Bash 中的字节数组(可能包含特殊字符)
Byte array (may contain special character) in Bash
使用来自 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顺利通过呢?
请学习引用你的扩展:使用 printf "$variable"
,而不是 printf $variable
最简单的原因是 c 将变量定义为以零字节结尾。
因此 c 字符串不能包含零字节。
Bash(用 c 编写),静默删除 variables.
中的任何零值
但可以在流(管道等)中使用零字节。
简单的解决方法是不将值(解码后)存储在变量中。
另请注意,当以 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个零字节。
使用来自 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顺利通过呢?
请学习引用你的扩展:使用 printf "$variable"
,而不是 printf $variable
最简单的原因是 c 将变量定义为以零字节结尾。
因此 c 字符串不能包含零字节。
Bash(用 c 编写),静默删除 variables.
但可以在流(管道等)中使用零字节。
简单的解决方法是不将值(解码后)存储在变量中。
另请注意,当以 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个零字节。