我的shell脚本文件模板及一些常用函数

#!/bin/sh
#
#Author: DenisHuang
#Date:
#Description:
#Usage:
#
#下面这行比较重要,主要是保证放在crontab里跑时,还能认出各个命令的路径,不然就得写死绝对路径
source /etc/profile
#下面这行当脚本里有用join相关的操作时很重要,某些编码格式会令sort的排序规则不一致,从而导致join出现数据丢失问题
export LC_ALL=C
#
#初始化参数
#最常见的参数就是每日定期运行的脚本所要用到的日期参数,不传值的话默认为昨天
#
function init()
{
  theDay="$1"
  if [ "$theDay" = "" ]
  then
    theDay=`date +%Y%m%d -d "1 days ago "`
  fi
  theDay2=`date +%Y-%m-%d -d "$theDay"`
}


#
#执行sql语句
#支持传参或管道方式
#
function executeSql()
{
  sql="$1"

  if [ "$sql" = "" ]
  then
    cat | mysql -uroot  -N  --local-infile
  else
    echo "$sql" | mysql -uroot  -N --local-infile
  fi
}
#
#产生分表序号
#在对分表进行批量sql操作时特别有用。
#
function range()
{
  echo "" | awk '{
    for(i=0;i<100;i++){
      printf("d\n",i);
    }
  }'
}
function range3()
{
  echo "" | awk '{
    for(i=0;i<1000;i++){
      printf("d\n",i);
    }
  }'
}
#
#url格式化编码
#在wget要post数据时,就可能要用到这个
#
function  urlencode() {
    od -An -tx1 | awk '{gsub(" ","%"); printf("%s",$0);}'
}
#
#下载html文档,源代码存在$html变量里,支持session保持,仿IE UA,透传Referer
#使用本函数就可以模拟登录动作等等,仿真度极高
#
function getHtml(){
  url="$1"
  wget "$url" -O a.tmp  -q --keep-session-cookies --save-cookies "cookie.tmp" --load-cookies "cookie.tmp" --retry-connrefused --tries=16 --user-agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" --referer="$referer"
  html=`cat a.tmp | sed 's/\r//g' `
  referer="$url"
}
#
#等待指定的时间,如果本身作业时间超过了需等待时间,就不等待,直接进入下一步。
#在用死循环写的放后台进程跑的定时执行任务需求中,很有用。
#
function waitFor()
{
  targetTime=`date +%s -d "$thisTime $sleepInterval"`
  nowTime=`date +%s`
  sleepTime=`expr $targetTime - $nowTime`
  if [ $sleepTime -gt 0 ]
  then
    echo "等待$sleepTime..."
    sleep $sleepTime
    echo "继续下一步."
  fi
  thisTime=`date +"%Y-%m-%d %H:%M:%S"`
}
#
#保存断点,断点文件的格式为:文件名 断点 最后更新日期
#最后更新日期的作用是为了不保留过期的断点,以使得断点文件尽可能的小。
#
function saveBreakPoint()
{
  fname="$1"
  bpoint="$2"
  bptxt=`cat breakpoint.txt | awk '{
    if($1!=fname && $3>=yesterday){
      print $0
    }
  }END{
    print fname,bpoint,today
  }' fname="$fname" bpoint="$bpoint" today="$today" yesterday="$yesterday"`
  echo "$bptxt" > breakpoint.txt
}
#
#读指定文件的断点
#
function readBreakPoint()
{
  fname="$1"
  cat breakpoint.txt | awk '$1==fname{print $2}' fname="$fname"
}
#主函数
function main()
{
  init "$1"
}
main "$1"

Comments