用于将时间戳与当前时间进行比较的Unix脚本

Her*_*r33 4 unix shell unix-timestamp

这是我进入Unix脚本领域的第一次旅程,我不知道如何解决这个问题.我要查询数据库并提取时间戳.我需要做的是采用时间戳(以令人敬畏的格式YYYYMMDDHHMMSS),如果超过10分钟,则返回1,否则返回0.

同样,我对这种类型的脚本基本上没有经验(背景是在C++和C#中)所以如果你们不介意多一点解释我会很感激 - 我想知道它是如何工作的.

谢谢!

gho*_*oti 5

工具的工作方式取决于您使用的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
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个/bin/sh脚本,为了便于携带,因此它不会利用您在Linux中习惯的bash- [[ ... ]]isms ,特别是heretext来读取变量.

哦,当你说"返回值"时,我假设你的意思是"退出价值".返回值是函数的结果,但我上面写的是一个独立的脚本.

请注意,这可能无法理解将来的时间戳,也不需要考虑时区.如果这对你很重要,那么你应该考虑一下.:-)并在您的环境中进行测试.


dj_*_*ult 2

假设 $dbtimestamp 具有从数据库返回的时间戳,但我在这里对其进行硬编码。

dbtimestamp=20120306142400

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