判断输入的日期是否正确的shell脚本

今儿个讲得是判断输入的日期是否正确,有利用到我们之前03这个例子中的函数
下面是代码

#!/bin/sh
# valid-date -- Validates a date, taking into account leap year rules.

exceedsDaysInMonth()
{

 case $(echo $1|tr '[:upper:]' '[:lower:]') in
  jan* ) days=31  ;; feb* ) days=28  ;;
  mar* ) days=31  ;; apr* ) days=30  ;;
  may* ) days=31  ;; jun* ) days=30  ;;
  jul* ) days=31  ;; aug* ) days=31  ;;
  sep* ) days=30  ;; oct* ) days=31  ;;
  nov* ) days=30  ;; dec* ) days=31  ;;
  * ) echo "$0: Unknown month name $1" >&2; exit 1
  esac

  if [ $2 -lt 1 -o $2 -gt $days ] ; then
   return 1
  else
   return 0  # the day number is valid
  fi
}

isLeapYear()
{

 year=$1
 if [ "$((year % 4))" -ne 0 ] ; then
  return 1 # nope, not a leap year
 elif [ "$((year % 400))" -eq 0 ] ; then
  return 0 # yes, it's a leap year
 elif [ "$((year % 100))" -eq 0 ] ; then
  return 1
 else
  return 0
 fi
}
## Begin main script

if [ $# -ne 3 ] ; then
 echo "Usage: $0 month day year" >&2
 echo "Typical input formats are 8 3 2002" >&2
 exit 1
fi

# Normalize date and split back out returned values

if [ $? -eq 1 ] ; then
 exit 1    # error condition already reported by normdate
fi

monthnoToName()
{
 # Sets the variable 'month' to the appropriate value
 case $1 in
  01|1 ) monthd="Jan"  ;; 02|2 ) monthd="Feb"  ;;
  03|3 ) monthd="Mar"  ;; 04|4 ) monthd="Apr"  ;;
  05|5 ) monthd="May"  ;; 06|6 ) monthd="Jun"  ;;
  07|7 ) monthd="Jul"  ;; 08|8 ) monthd="Aug"  ;;
  09|9 ) monthd="Sep"  ;;   10) monthd="Oct"  ;;
    11) monthd="Nov"  ;;   12) monthd="Dec"  ;;
  * ) echo "$0: Unknown numeric month value $1" >&2; exit 1
  esac
  return 0
}

monthnoToName $1

month="$monthd"
 day="$2"
 year="$3"

if ! exceedsDaysInMonth $month "$2" ; then
 if [ "$month" = "Feb" -a "$2" -eq "29" ] ; then
  if ! isLeapYear $3 ; then
   echo "$0: $3 is not a leap year, so Feb doesn't have 29 days" >&2
   exit 1
  fi
 else
  echo "$0: bad day value: $month doesn't have $2 days" >&2
  exit 1
 fi
fi

echo "Valid date: $newdate"

exit 0

分析:
1)首先判断用户输入的参数个数是否正确,接着case $1 in 语句判断月份是否合理。
2)monthnoToName 函数之前出现在我们之前的第03个脚本案例中,用来转换输入的数字日期为字符串。
3) exceedsDaysInMonth 用来判断天数是否超过对应月的最大天数,紧跟着 if [ "$month" = "Feb" -a "$2" -eq "29" ] ; then if ! isLeapYear $3 ; then 用来判断闰年2月的特殊情况
4)总体的感觉是脚本还是很紧凑的,特别是在判断闰年与2月的关系的那段代码,有点意思。

时间: 2016-08-13

shell脚本echo输出不换行功能增强实例

这是第8/101个脚本 There are as many ways to solve this quirky echo problem as there are pages in this book. One of my favorites is very succinct: function echon { echo "$*" | awk '{ printf "%s" $0 }' } You may prefer to avoid the overhead in

Linux Shell 脚本编程入门教程

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用.深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh).Bourne

使用Shell 脚本实现每隔100行插入一条记录且记录第一列包含行号其他列不变

1.例子:每隔100行插入一条记录,并且此条记录的第一列包含行号,其他列与第一行相同 #!/bin/sh var="00001" # 变量 cat a.txt|awk 'NR==1'|while read line # 获取文件第一行 do #echo "$line" result=`echo "$line"|cut -f2-` # 默认以tab分割,获取第二列至最后一列 cat a.txt|awk 'NR%100==0{printf("

PowerShell中捕获异常时的行号和列号的方法

如果自己写函数动态地去执行一些脚本块或者脚本文件,那么捕获到异常时行号和列号信息非常有用.例如脚本文件: 复制代码 代码如下: trap{ $info=$_.InvocationInfo "在第{0}行,第{1}列捕获到异常:{2}" -f $info.ScriptLineNumber,$info.OffsetInLine ,$_.Exception.Message continue }   get-date 1gb/2kb Get-Service | foreach {1/0} 执行

Python中多个数组行合并及列合并的方法总结

采用numpy快速将两个矩阵或数组合并成一个数组: import numpy as np 数组 a = [[1,2,3],[4,5,6]] b = [[1,1,1],[2,2,2]] 1.数组纵向合并 1) c = np.vstack((a,b)) c = array([[1, 2, 3], [4, 5, 6], [1, 1, 1], [2, 2, 2]] 2) c = np.r_[a,b] c = array([[1, 2, 3], [4, 5, 6], [1, 1, 1], [2, 2, 2

jQuery实现获取table中鼠标click点击位置行号与列号的方法

本文实例讲述了jQuery实现获取table中鼠标click点击位置行号与列号的方法.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>www.jb51.net 鼠标点击位置行列号</title> </head> <bo

python DataFrame获取行数、列数、索引及第几行第几列的值方法

1.df=DataFrame([{'A':'11','B':'12'},{'A':'111','B':'121'},{'A':'1111','B':'1211'}]) print df.columns.size#列数 2 print df.iloc[:,0].size#行数 3 print df.ix[[0]].index.values[0]#索引值 0 print df.ix[[0]].values[0][0]#第一行第一列的值 11 print df.ix[[1]].values[0][1]

android 修改launcher行数和列数的方法

android 修改launcher行数和列数 Launcher3桌面的行数和列数都是在InvariantDeviceProfile.java和DeviceProfile.java中动态计算的,xml中无法配置. Note:L版本无InvariantDeviceProfile.java,是DynamicGrid.java,但是计算方法都是一样的. InvariantDeviceProfile中用InvariantDeviceProfile来配置各种屏幕的手机桌面.如下: InvariantDev

Yii遍历行下每列数据的方法

本文实例讲述了Yii遍历行下每列数据的方法.分享给大家供大家参考,具体如下: 效果图如下: 控制器(1种): //显示列表 public function actionList() { //实例化对象 $model= new Qiu(); $country = \Yii::$app->db; //查询数据 $data = $country->createCommand("select * from qiu join region on qiu.region_id=region.reg

JavaScript获取GridView中用户点击控件的行号,列号

复制代码 代码如下: <asp:ImageButton ID="BtnMailaddress" runat="server" ImageUrl="../img/Search.gif" ImageAlign="Top" TabIndex="0" OnClientClick = "javascript:openImage(this);return false;"/> functi

FLEX 获取DataGrid行号和列号示例代码

一.获取行号 复制代码 代码如下: var findex:Number = Math.floor(dg.contentMouseY/dg.rowHeight)-1 + dg.verticalScrollPosition; //dg.contentMouseY是鼠标所在的local坐标系相对于datagrid的高度 //dg.rowHeight是datagrid的行高,math.floor作用是截断小数点 //verticalScrollPosition是如果datagrid有滚动条的话,向下滚动

PowerShell中把相对路径转换为绝对路径的2个方法

在PowerShell中,有时候,我们需要把当前的相对路径解析为绝对路径,比如".\test.txt",我们想知道它的绝对路径的话,我们有两种方法可以实现. 1.有一个cmd-let,它叫Resolve-Path. 语法如下: 复制代码 代码如下: Resolve-Path <相对路径> 如果指定的相对路径的文件或文件夹,不存在,则将提示如下: 复制代码 代码如下: PS C:\Users\zhanghong> Resolve-Path .\test.txt Reso

js获取表格的行数和列数的方法

如何使用JavaScript获取一个表格的行数和列数?其实很简单,假设存在如下表格: <table width="100%" border="1" cellspacing="0" cellpadding="0" id="example_table"> <tr> <td> </td> <td> </td> <td> </