Способ работы ваших инструментов зависит от того, какой 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, в частности [[ ... ]]
и здесь для чтения переменных.
О, и я предполагаю, что вы имели в виду «выходное значение», когда говорили «возвращаемое значение». Возвращаемое значение будет результатом функции, но то, что я написал выше, является автономным скриптом.
Обратите внимание, что это может не понимать метки времени в будущем и не учитывает часовой пояс. Если это важно для вас, вы должны это рассмотреть. :-) И проверить в своей среде.