我正在尝试编写一个脚本,它使用日期的 SHA,但我得到了两个不同的结果,并且我一生都无法弄清楚为什么。
echo -n 03112016 | cut -d'.' -f4 | sha256sum | cut -d' ' -f 1
482c00f7db8419d9f9a151d54de301d73c8f688b2e3e91c485f369596543612e
date "+%m%d%Y" | tr -d '\n' | sha256sum | cut -d' ' -f 1
d373ab72ec7d92ee06ebba4748f78829cd62ce68f1ac600ae1767a272869b664
我知道这对我来说一定是愚蠢的事情,但我真的很感谢任何帮助。
答案1
设计用于操作文本的 Shell 实用程序(例如cat
、cut
、sort
、tail
等)要求其输入是文本文件。文本文件,用 Unix 术语来说:
- 仅包含环境区域设置(
LC_CTYPE
区域设置)中的有效字符,空字节除外; - 由一系列行组成,每行都以换行符(
\n
也称为换行符)终止。
第二点意味着任何非空文件都以换行符结尾。
如果输入不是文本文件会发生什么取决于实用程序。旧的 Unix 系统倾向于忽略空字节之后的行上的文本,并忽略最后一个不完整行的全部或部分(最后一个换行符之后的文本)。 GNU 版本始终将空字节视为普通字符,并且大多数情况下会传递无效字节序列。即使最后的换行符丢失,GNU 版本也始终处理整个输入,但它们的不同之处在于是否在输出中添加尾随换行符。例如,GNUcat
总是通过不变地传递其输入,但许多其他(包括 )cut
总是在每个输出行(包括最后一行)的末尾打印换行符。
因此,当您生成参考输入时,您需要在最后一刻抑制尾随换行符。
echo 03112016 | cut -d'.' -f4 | tr -d '\n' | sha256sum
要不就
echo -n 03112016 | sha256sum