Bash 支持多个发行版的日期函数

Bash 支持多个发行版的日期函数,bash,shell,sh,Bash,Shell,Sh,我正在寻找一些与编写一个可以在ubuntu、AmazonLinux和OSX等操作系统上执行的脚本相关的帮助 下面是一个简单的脚本,用于计算两个日期之间的天数 #!/bin/bash current_date=$(gdate '+%Y-%m-%d') first_date=$(gdate -d "$current_date" "+%s") second_date=$(gdate -d "${1}" "+%s") case "$3" in "--seconds" | "-s") per

我正在寻找一些与编写一个可以在ubuntu、AmazonLinux和OSX等操作系统上执行的脚本相关的帮助

下面是一个简单的脚本,用于计算两个日期之间的天数

#!/bin/bash

current_date=$(gdate '+%Y-%m-%d')

first_date=$(gdate -d "$current_date" "+%s")
second_date=$(gdate -d "${1}" "+%s")

case "$3" in
    "--seconds" | "-s") period=1
    ;;
    "--minutes" | "-m") period=60;;
    "--hours" | "-h") period=$((60*60));;
    "--days" | "-d" | "") period=$((60*60*24));;
esac

datediff=$(( ($first_date - $second_date)/($period) ))
上面提到的问题是,它只能在有gdate(GNU日期)的OSX上运行有人能推荐一个执行相同过程并可在不同系统上执行的解决方案吗?


谢谢

我找到了一个令我满意的解决方案。因此,我正在检查正在使用哪个发行版,并基于此,我可以选择正确的工具:
gdate
在OSX上,
date
否则

check_package() {
  package_name=${1}
  check_type=$(which ${package_name})
  if [[ -z "${check_type}" ]] ;
  then
    echo "Install the required ${package_name} which isn't installed!"
    echo "Ensure ${package_name} is in your $PATH"
    exit 2
  fi
}
# Usage calculate_date_diff package_name date -d/-h/-m/-s
calculate_date_diff() {
  current_date=$(${1} '+%Y-%m-%d')
  first_date=$(${1} -d "$current_date" "+%s")
  second_date=$(${1} -d "${2}" "+%s")

  case "${3}" in
    "--seconds" | "-s") period=1;;
    "--minutes" | "-m") period=60;;
    "--hours" | "-h") period=$((60*60));;
    "--days" | "-d" | "") period=$((60*60*24));;
  esac

  datediff=$(( (${first_date} - ${second_date})/(${period}) ))
  echo ${datediff}
}

# Format of date: yyyy-mm-dd
DATE_IN_PAST=${1}

# Detect the platform (similar to $OSTYPE)
OS="$(uname)"
case ${OS} in
  'Darwin') 
    check_package "gdate" && calculate_date_diff "gdate" ${DATE_IN_PAST} -d
    ;;
  'Linux')
    check_package "date" && calculate_date_diff "date" ${DATE_IN_PAST} -d
    ;;
  'FreeBSD')
    check_package "date" && calculate_date_diff "date" ${DATE_IN_PAST} -d
    ;;
  'SunOS')
    check_package "date" && calculate_date_diff "date" ${DATE_IN_PAST} -d
    ;;
  *) ;;
esac

gdate
即使在OS X上也默认不可用。但是
date
在任何地方都可用。您尝试过使用日期吗?是的,您是正确的,但OSX上的日期行为完全不同。简而言之,OSX日期!=Linux/ubuntu日期如果你要发布一个答案,把代码放在答案中,而不仅仅是一个指向外部站点的链接。