#!/bin/bash
# Program's Purpose: Compute time elapsed between epoch time and current time
# Produce an MD5 hash from that time
# Get code from that hash
# compute time elapsed in seconds between epoch time and current time
#EPOCH=$(date -u -d '2001-02-03 04:05:06' '+%F %H:%M:%S')
#CURRENT=$(date -u -d '2010-06-13 12:55:34' '+%F %H:%M:%S')
# code: dd15
EPOCH=$(date -u -d '1999-12-31 23:59:59' '+%F %H:%M:%S')
CURRENT=$(date -u -d '2013-05-06 07:43:25' '+%F %H:%M:%S')
# interval is time elapsed minus time elapsed % 60
echo $EPOCH
echo $CURRENT
read YEAR1 M1 DAY1 HOUR1 MIN1 SEC1 <<< "${EPOCH//[:-]/ }"
read YEAR2 M2 DAY2 HOUR2 MIN2 SEC2 <<< "${CURRENT//[:-]/ }"
echo $YEAR1 $M1 $DAY1 $HOUR1 $MIN1 $SEC1
# date in seconds from
sec1=$(date -d "$EPOCH" -u +%s)
sec2=$(date -d "$CURRENT" -u +%s)
echo $sec1
echo $sec2
# get the difference from the two times
difference=$((sec2 - sec1))
difference=$((difference - ((difference % 60))))
echo $difference
# get the hash from the time
hash=$(echo -n $difference | md5sum | tr -d '\n')
hash=$(echo -n $hash | md5sum | tr -d '\n')
echo $hash
# creating two strings, one with all of the letters
# the other with all of the numbers
letter=$(echo $hash | sed 's/[0-9]*//g' | cut -c1-2)
echo $letter
num=$(echo $hash | sed 's/[^0-9]*//g')
echo $num
#num=$(echo $num | cut -c1-2)
#echo $num
# getting the last two numbers in reverse order
num1=$(echo ${num: -1})
num=$(echo "${num::-1}")
echo $num
num2=$(echo ${num: -1})
code="$letter$num1$num2"
echo $code
我正在尝试编写一个需要大量时间的程序 当前时间,以秒为单位计算差异,然后创建一个 代码通过以秒为单位执行双md5哈希。到了什么时候 我现在进入,秒的差异应该是421, 141,406和&#39;代码&#39;应该是基于60秒 间隔,所以我尝试生成的代码应该来自421, 141,380。
结果哈希应该是
042876ca07cb2d993601fb40a1525736
,但我得到了
d49904f9e7e62d0ff16e523d89be08eb
。任何人都可以告诉我我在做什么
错了吗?
我读到bash在结束时留下了换行符
字符串,所以我使用-n
选项运行echo以删除该换行符,但我是
仍然没有得到首选的结果。
答案 0 :(得分:2)
许多平台上md5sum
的输出仅 MD5总和。例如,在GNU / Linux系统上,你得到
debian$ echo -n 401 | md5sum
816b112c6105b3ebd537828a39af4818 -
请注意,输出有两个字段:实际的MD5总和,后跟两个空格,后跟输入文件名(其中-
代表标准输入)。
(相比之下,在OSX上,我希望大多数* BSD,你得到
yosemite$ echo -n 401 | md5
816b112c6105b3ebd537828a39af4818
在这里,您会注意到MD5实用程序的名称不同。)
修复应该很简单。我已将您的代码重构为(a)更喜欢便携式printf
而不是便携式echo -n
; (b)删除完全多余的最终tr -d '\n'
(已经通过shell修改了捕获变量末尾的换行符);并且(c)将所有内容折叠成一个管道。
hash=$(printf '%s' "$difference" | md5sum | cut -d ' ' -f 1 | tr -d '\n' |
md5sum | cut -d ' ' -f 1)
echo "$hash"
为完整起见,此代码也有适当的引用;它在这里并不是绝对必要的(例如,如果你真的需要保留最初从md5sum
获得的值的间距),但是省略引号是一个常见的新手问题,应该是避免。
(捕获变量只是为了echo
它也是一个常见的新手反模式;但是你的代码后来想要使用变量hash
。)
重复代码总是难闻的气味;也许提供一个与* BSD md5
实用程序执行相同工作的功能;
md5 () { md5sum "$@" | cut -d ' ' -f 1; }
hash=$(printf '%s' "$difference" | md5 | tr -d '\n' | md5)