- 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
版權所有,轉載請註明原文鏈接。
文中有不妥或者錯誤的地方還望指出,以免誤人子弟。如果覺得本文對你有所幫助不妨【推薦】一下!如果你有更好的建議,可以給我留言討論,共同進步!
再次感謝您耐心的讀完本篇文章。