shell中的getopt

Linux中的位置变量和预定义变量

shell中的getopts

  • getopt是一个外部命令,不是bash内置命令,Linux发行版通常会自带
  • getopt支持短选项和长选项
    老版本的getopt问题较多,增强版getopt比较好用,执行命令getopt -T; echo $?,如果输出4,则代表是增强版的
  • 如果短选项带argument且参数可选时,argument必须紧贴选项,如-carg 而不能是-c arg
  • 如果长选项带argument且参数可选时,argument和选项之间用“=”,如–clong=arg而不能是–clong arg

代码如下cat getopt.sh

#!/bin/sh
#*****************************************************************************************
#*** 程序功能:  按天和小时循环导入分区数据
#*** 输入参数:  -s|--start-day <START_DAY> :需要导入的开始日期,格式YYYYMMDD
#****           -e|--end-day <END_DAY> :需要导入的结束日期,格式YYYYMMDD
#****           -b|--start-hour <START_HOUR> :开始日期需要开始的小时,格式HH,可选参数,默认00
#****           --end-hour <END_HOUR> :结束日期需要结束的小时,格式HH,可选参数,默认23
#****           -f|--file <SOL_FILE> :SQL脚本绝对路径名称
#*** 编 写 人:  fuyun
#*** 编写日期:  2020-02-05
#*** 修 改 人:  
#*****************************************************************************************

show_usage="[Usage] `date '+%F %T'` `basename $0` -s=YYYYMMDD -e=YYYYMMDD -f=filePath \n \
                                       --start-day=YYYYMMDD --end-day=YYYYMMDD [--start-hour=HH] [--end-hour=HH] --file=filePath"

GETOPT_ARGS=`getopt -o s:e:b::f: -l start-day:,end-day:,start-hour::,end-hour::,file: -- "$@"`
#将规范化后的命令行参数分配至位置参数($1,$2,...)
eval set -- "$GETOPT_ARGS"  

# 开始小时默认为00,结束小时默认为23
START_HOUR=00
END_HOUR=23

# 获取参数
while [ -n "$1" ]
do
  case "$1" in
    -s|--start-day) START_DAY=$2; shift 2;; #shift 2表示参数后移2个
    -e|--end-day) END_DAY=$2; shift 2;;
    -b|--start-hour) 
      case "$2" in 
        "") START_HOUR=00; shift 2;; 
        *) START_HOUR=$2; shift 2;;
      esac;;
    --end-hour) 
      case "$2" in 
        "") END_HOUR=23; shift 2;;
        *) END_HOUR=$2; shift 2;;
      esac;;
    -f|--file) SOL_FILE=$2; shift 2;;
    --) break ;;
    *) echo $1,$2,${show_usage}; break ;;
  esac
done

# check parameter
if [ -z "${START_DAY}" -o -z "${END_DAY}" -o -z "${START_HOUR}" -o -z "${END_HOUR}" -o -z "${SOL_FILE}" ]; then
    echo -e "${show_usage} \n"
    exit 1
fi

FLAG_DAY=${START_DAY}

executeHive() {
  while :
  do
    local STAT_HOUR=00
    local FLAG_HOUR=23
    local START_DAY=$(date -d "$START_DAY 1day"  +%Y%m%d)
    local STAT_DAY=`date -d "${START_DAY} -1 day" +%Y%m%d`
    
    # 判断执行日期是否为开始日期或结束日期
    if [ ${STAT_DAY} -eq ${FLAG_DAY} ]; then
      STAT_HOUR=${START_HOUR}
    elif [ ${STAT_DAY} -eq ${END_DAY} ]; then
      FLAG_HOUR=${END_HOUR}
    fi
   
    while :
    do   
      printf "[INFO] `date '+%F %T'` current execute partition is dt=${STAT_DAY} hour=${STAT_HOUR}\n"
      
      exitCode=$?
      if [ $exitCode -ne 0 ];then
        printf "[ERROR] `date '+%F %T'` hivesql execute ${SOL_FILE} is failed!!!\n"
        exit $exitCode
      else
        printf "[INFO] `date '+%F %T'` hivesql ${STAT_DAY} ${STAT_HOUR} data execute success!!!\n" 
      fi
      
      # 因为小时小于10时前面有0,shell脚本会认为是八进制数字,所以要转为十进制数字
      #STAT_HOUR=$((10#$STAT_HOUR+1))
      STAT_HOUR=$(($STAT_HOUR+1))
      
       # 判断小时是否小于10
      if [ ${STAT_HOUR} -lt 10 ]; then
        STAT_HOUR=0${STAT_HOUR}
      fi
      
      # 如果执行小时大于设置的结束小时,退出循环
      if [ ${STAT_HOUR} -gt ${FLAG_HOUR} ]; then
        break;
      fi
    
    done
    
    # 判断执行日期是否等于结束日期,等于则退出循环
    if [ ${STAT_DAY} -eq ${END_DAY} ]; then
      break;
    fi
    
  done
}

if [ ${START_DAY} -gt ${END_DAY} ]; then
  printf "[ERROR] `date '+%F %T'` --start-day:${START_DAY} greater than --end-day:${END_DAY}\n"
  exit 1
elif [ ${START_HOUR} -ge 24 ] || [ ${START_HOUR} -lt 0 ] || [ ${END_HOUR} -ge 24 ] || [ ${END_HOUR} -lt 0 ]; then
  printf "[ERROR] `date '+%F %T'` --start-hour:${START_DAY} or --end-hour:${END_DAY} is not 00-23 \n"
  exit 1
else
  executeHive
  printf "[INFO] `date '+%F %T'` hivesql ${START_DAY} to ${END_DAY} data execute success!!!\n"
fi

测试:

sh getopt.sh -s 20200102 -e 20200103 -b22 --end-hour=02 -f getopt.sh
[INFO] 2020-02-05 23:37:38 current execute partition is dt=20200102 hour=22
[INFO] 2020-02-05 23:37:38 hivesql 20200102 22 data execute success!!!
[INFO] 2020-02-05 23:37:38 current execute partition is dt=20200102 hour=23
[INFO] 2020-02-05 23:37:38 hivesql 20200102 23 data execute success!!!
[INFO] 2020-02-05 23:37:38 current execute partition is dt=20200103 hour=00
[INFO] 2020-02-05 23:37:38 hivesql 20200103 00 data execute success!!!
[INFO] 2020-02-05 23:37:38 current execute partition is dt=20200103 hour=01
[INFO] 2020-02-05 23:37:38 hivesql 20200103 01 data execute success!!!
[INFO] 2020-02-05 23:37:38 current execute partition is dt=20200103 hour=02
[INFO] 2020-02-05 23:37:38 hivesql 20200103 02 data execute success!!!
[INFO] 2020-02-05 23:37:38 hivesql 20200102 to 20200103 data execute success!!!

to be a better me, talk is cheap show me the code

版权所有,转载请注明原文链接。

文中有不妥或者错误的地方还望指出,以免误人子弟。如果觉得本文对你有所帮助不妨【推荐】一下!如果你有更好的建议,可以给我留言讨论,共同进步!

再次感谢您耐心的读完本篇文章。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值