`
ganliang13
  • 浏览: 252787 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

shell 年月日 处理

阅读更多
!/bin/bash
get_mon_days()
{
 Y=`expr substr $1 1 4`
 M=`expr substr $1 5 2`

 r1=`expr $Y \% 4`
 r2=`expr $Y \% 100`
 r3=`expr $Y \% 400`

 case $M in
 01|03|05|07|08|10|12) days=31;;
 04|06|09|11) days=30;;
 02)
  r1=`expr $Y \% 4`
  r2=`expr $Y \% 100`
  r3=`expr $Y \% 400`
  # 闰年
  if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0  ] ; then
   days=29
  else
   days=28
  fi
  ;;
 *)
  days=0
  ;;
 esac
 echo $days
}

check_date()
{
 # 0 合法 1 非法
 FLAG=0
 Y=`expr substr $1 1 4`
 M=`expr substr $1 5 2`
 D=`expr substr $1 7 2`

 days=`get_mon_days $Y$M`

 if ! [ $D -ge 1 -a $D -le $days ] ; then
  FLAG=1
 fi
 return $FLAG
}

get_before_date()
{
 Y=`expr substr $1 1 4`
 M=`expr substr $1 5 2`
 D=`expr substr $1 7 2`
 YY=`expr $Y - 1`
 MM=`expr $M - 1`
 DD=`expr $D - 1`
 MM=`printf "%02d" $MM`
 DD=`printf "%02d" $DD`
 dd=$Y$MM
 dad=`get_mon_days $dd`
 be_date=$Y$M$DD
 if [ $D -eq 01 ]
 then
  if [ $M -ne 01 ]
  then
   be_date=$Y$MM$dad
  fi
  if [ $M -eq 01 ]
  then
   be_date=$YY"1231"
  fi
 fi
 echo $be_date
}

get_next_date()
{
 Y=`expr substr $1 1 4`
 M=`expr substr $1 5 2`
 D=`expr substr $1 7 2`
 YY=`expr $Y + 1`
 MM=`expr $M + 1`
 DD=`expr $D + 1`
 MM=`printf "%02d" $MM`
 DD=`printf "%02d" $DD`
 r1=`expr $Y \% 4`
 r2=`expr $Y \% 100`
 r3=`expr $Y \% 400`

 # 通常情况
 next_date=$Y$M$DD

 # 特殊情况1,小月月末
 if [ $D -eq 30 ]
 then
  case $M in
  04|06|09|11) next_date=$Y$MM"01";;
  esac
 fi
 # 特殊情况2,大月月末
 if [ $D -eq 31 ]
 then
  next_date=$Y$MM"01"
  case $M in
   12) next_date=$YY"0101";;
  esac
 fi
 # 特殊情况3,2月月末
 if [ $M -eq 02 ]
 then
  # 闰年
  if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ]
  then
   if [ $D -eq 29 ]
   then
    next_date=$Y$MM"01"
   fi
  else
   if [ $D -eq 28 ]
   then
    next_date=$Y$MM"01"
   fi
  fi
 fi
 echo $next_date
}

format_date()
{
 Y=`expr substr $1 1 4`
 M=`expr substr $1 5 2`
 D=`expr substr $1 7 2`
 echo $Y"-"$M"-"$D
}

if [ $# -ne 1 ] 
then    
    n_today=$(date -d "0 days ago" +%Y%m%d)
elif check_date $1
then
    n_today=$1
else
    n_today=$(date -d "0 days ago" +%Y%m%d)
fi
v_yesterday=$(format_date $(get_before_date $n_today))
v_today=$(format_date $n_today)
n_yesterday=$(get_before_date $n_today)

echo $n_yesterday
echo $n_today
echo $v_yesterday
echo $v_today
 
 

 

分享到:
评论

相关推荐

    shell编程 之 正则表达式

    在Shell编程中,正则表达式是一种非常强大的文本处理工具,可以用于模式匹配、文本搜索与替换等操作。它能够帮助我们更加灵活地处理各种字符串数据,是自动化脚本编写中的重要组成部分。 #### 正则表达式的分类与...

    shell脚本循环调度程序

    在计算机编程领域,shell脚本是一种使用Unix Shell语言编写的脚本程序,它被广泛应用于自动化任务处理、系统管理等领域。标题“shell脚本循环调度程序”表明这是一段用于循环执行特定任务的shell脚本代码。 #### 二...

    Shell_经典实例

    1. **获取当前年月**:使用`date +%Y`和`date +%m-1|bc`分别获取当前年份和上一个月的月份。 2. **调整月份和年份**:如果月份小于1,则将月份设为12,并将年份减去1。 3. **计算当月天数**:使用`cal`命令获取指定...

    Linux常用的系统监控shell脚本

    1. **时间戳生成**:生成当前的年月日和小时信息。 2. **目录结构维护**:根据当前时间和日期创建日志存储目录。 3. **延迟执行**:设置延迟执行时间,避免资源过度消耗。 这些脚本不仅能够实时监控系统状态,还...

    实验三 shell 脚本实验.doc

    在此部分,学生需要编写一个Shell脚本,该脚本能接收用户输入的年月信息,然后显示相应的日历,同时显示当前日期和时间。实验中提到了三种执行脚本的方法: 1. 输入定向到脚本(`$bash),但由于输入命令错误,这种...

    习题07-Shell编程.doc

    如果为空,创建`/root/bak`目录并进入(#2-#3),接着获取当前日期的年月日(#4),并基于这些日期信息创建压缩文件名(#5),最后将`/etc`目录打包并保存至`/root/bak`(#6)。整个程序的功能是创建一个名为`/root/...

    crontab与shell脚本

    - 在编写Shell脚本时,需要注意防止命令注入攻击,尤其是在处理外部输入的情况下。 - 对于敏感操作,如删除文件,应确保只针对指定的目标执行,避免误操作造成损失。 通过上述内容,我们可以了解到`crontab`和...

    linux操作系统实验报告_shell简单编程.pdf

    在Shell脚本中,`date +%Y%m%d%H%M`用于获取当前的年月日小时分钟格式的时间。脚本通过循环检查用户输入的密码,只有当输入与系统时间一致时才会跳出循环并显示成功信息。这个脚本展示了如何使用内建的命令读取用户...

    shell 计算日期

    在Shell脚本中进行日期计算是一种常见的需求,尤其是在处理时间序列数据、定时任务或者需要基于日期进行逻辑判断的场景下。给定的脚本主要涉及到了如何计算指定日期的前N天、后N天以及获取特定日期是星期几的功能。 ...

    实验三 shell 脚本实验

    【实验三 Shell 脚本实验...通过这些实验,学生不仅能掌握Bash的基本操作,还能了解到如何处理用户输入、控制流程、调用系统命令以及进行简单的数据处理。这对于日常系统管理、自动化任务和脚本编写具有实际应用价值。

    shell脚本100例.pdf

    这里使用反引号括起来的date命令生成一个以年月日为名称的压缩包,防止文件覆盖。 4. **计划任务(Cron)**:通过crontab命令可以设置定时任务,实现周期性执行脚本。例如: ```bash 0 3 *** 5 /root/logbak.sh ...

    unix shell 常用正则表达式

    - `^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$`:匹配年月日格式的日期。 - `/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/`:匹配月日年格式的日期。 2. ...

    Julian-Date-Script:将 YMD 转换为 Julian Date 的 Shell 脚本

    标题中的“Julian-Date-Script”指的是一个用于转换日期的特定脚本,它能够将常用的年月日(YMD)格式的日期转换为儒略日期。儒略日期是一种连续的日期系统,从公元前4713年1月1日午夜开始计数,广泛应用于天文学和...

    sh代码-不用date编写计算时间的脚本

    然而,在某些情况下,如在没有`date`命令的精简环境或者需要自定义时间处理逻辑时,我们可以使用内置的shell函数和算术运算来实现类似的功能。 首先,让我们了解shell中的时间单位。在shell中,我们通常使用秒作为...

    shell编程案例最新版期末考试题.docx

    `date+%y%m%d`格式化日期为年月日。`tar`命令可以用来创建压缩文件,但在这个例子中,具体的压缩命令未给出。 5. **查找含特定字符串的文件** 脚本接收两个参数,第二个参数是目录路径。它遍历目录中的所有文件,...

    Shell中的变量使用小结

    如果需要更详细的日期格式,如年月日,可以这样做: ```bash YEAR=`date +%Y年%m月%d日` TODAY=`date +%A` echo "今天是 $YEAR, $TODAY" ``` 从键盘获取用户的输入是与用户交互的基础。`read`命令可以读取用户输入...

    工作常用shell脚本

    4. **获取日期信息**:使用 `date` 命令获取年月日信息,并拼接成备份文件名。 5. **执行备份操作**:使用 `tar zcvf` 命令将 `/etc` 目录压缩为 `.tar.gz` 文件。 **应用场景**: - 定期备份系统关键配置文件,...

    超级运维的109个shell脚本合集

    - `date +%F_%H-%M-%S`:获取当前日期时间格式为年月日_小时-分钟-秒。 - `[ ! -d $BACKUP_DB_DIR ] && mkdir -p $BACKUP_DB_DIR &>/dev/null`:检查备份目录是否存在,不存在则创建之,忽略输出。 ### 总结 以上...

Global site tag (gtag.js) - Google Analytics