这是我第一次出远门到的Unix脚本的境界,我不知道如何去了解这一点。我会查询一个数据库并提取一个时间戳。我需要做的是采取时间戳(以真棒格式YYYYMMDDHHMMSS
),如果它超过10分钟,返回1返回0.的Unix脚本来比较时间戳与当前时间
同样,我基本上没有这种类型的脚本的经验(背景是在C + +和C#)所以如果你们不介意多一点解释我会很感激 - 我想了解它是如何工作的。
谢谢!
这是我第一次出远门到的Unix脚本的境界,我不知道如何去了解这一点。我会查询一个数据库并提取一个时间戳。我需要做的是采取时间戳(以真棒格式YYYYMMDDHHMMSS
),如果它超过10分钟,返回1返回0.的Unix脚本来比较时间戳与当前时间
同样,我基本上没有这种类型的脚本的经验(背景是在C + +和C#)所以如果你们不介意多一点解释我会很感激 - 我想了解它是如何工作的。
谢谢!
假设$ dbtimestamp具有从数据库返回的时间戳,但是我在这里对它进行了硬编码。
dbtimestamp=20120306142400
secondsDiff=$((`date '+%Y%m%d%H%M%S'` - $dbtimestamp))
if [ $secondsDiff -gt 600 ]
then
exit 1
else
exit 0
fi
谢谢你,这工作完美! – Hershizer33 2012-03-06 20:47:33
这是治疗YmdHMS字符串,因为它们是十进制数字。 $((20120306150000 - 20120306145959))返回4041,而不是1 – djjeck 2012-11-26 21:20:57
是的,这就是为什么下一行比较秒数与600(10分钟)之间的差异,然后返回0或1. – 2012-11-28 14:15:58
你的工具的工作依赖于Unix的使用香精的方式。以下应在Linux下的FreeBSD,NetBSD的,OSX等
#!/bin/sh
sample="${1:-20120306131701}"
if ! expr "$sample" : '[0-9]\{14\}$' >/dev/null; then
echo "ERROR: unknown date format" >&2
exit 65
fi
case $(uname -s) in
*BSD|Darwin)
# The BSD date command allows you to specify an input format.
epoch=$(date -jf '%Y%m%d%H%M%S' "$sample" '+%s')
;;
Linux)
# No input format in Linux, so rewrite date to something '-d' will parse
tmpdate="$(echo "$sample" | sed -r 's/(.{8})(..)(..)(..)/\1 \2:\3:\4/')"
epoch=$(date -d "$tmpdate" '+%s')
;;
*)
echo "ERROR: I don't know how to do this in $(uname -s)." >&2
exit 69
;;
esac
now=$(date '+%s')
# And with the provided datetime and current time as integers, it's MATH time.
if [ $((now - epoch)) -gt 600 ]; then
exit 1
fi
exit 0
注意,这是一个/bin/sh
脚本,便携性的缘故工作,所以也没有充分利用的bash-ISMS你可能会习惯于在Linux中使用,特别是[[ ... ]]
和heretext来读取变量。
哦,我假设你说的“退出价值”,当你说“返回值”。返回值是一个函数的结果,但我上面写的是一个独立的脚本。
请注意,这可能不会理解将来的时间戳,也不需要考虑时区。如果这对你很重要,你应该,呃,考虑一下。 :-)并在您的环境中进行测试。
perl,python,ruby ..任何偏好? – 2012-03-06 18:02:02
使用'date'实用程序的格式将当前时间加上10 * 60 s格式化为与DB相同的格式,然后进行简单的字符串比较。琐碎在Bash,但我与Karoly一起喜欢什么? ... :) – 0xC0000022L 2012-03-06 18:05:39
他问unix .. – Teja 2012-03-06 18:06:02