Скрипт Unix для сравнения отметки времени с текущим временем - PullRequest
4 голосов
/ 06 марта 2012

Это мое первое путешествие в область сценариев Unix, и я не уверен, как это сделать. Я буду запрашивать БД и вытаскивать метку времени. Что мне нужно сделать, так это взять эту временную метку (в удивительном формате YYYYMMDDHHMMSS) и, если ей больше 10 минут, вернуть 1, иначе возвращается 0.

Опять же, у меня практически нет опыта работы с этим типом сценариев (опыт работы на C ++ и C #), так что если вы, ребята, не возражаете, немного больше объяснений, я был бы благодарен - я тоже хочу узнать, как это работает.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 06 марта 2012

Способ работы ваших инструментов зависит от того, какой 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, в частности [[ ... ]] и здесь для чтения переменных.

О, и я предполагаю, что вы имели в виду «выходное значение», когда говорили «возвращаемое значение». Возвращаемое значение будет результатом функции, но то, что я написал выше, является автономным скриптом.

Обратите внимание, что это может не понимать метки времени в будущем и не учитывает часовой пояс. Если это важно для вас, вы должны это рассмотреть. :-) И проверить в своей среде.

2 голосов
/ 06 марта 2012

Предположим, что $ dbtimestamp вернул временную метку из базы данных, но я жестко ее кодирую здесь.

dbtimestamp=20120306142400

secondsDiff=$(( `date '+%Y%m%d%H%M%S'` - $dbtimestamp ))
if [ $secondsDiff -gt 600 ] 
then
  exit 1
else
  exit 0
fi
...