You are on page 1of 7

#!

/bin/sh
程序描述:通用 shell 脚本,抽离出来通用的 shell 函数,供其他脚本调用
作者: 程晓鹏
日期: 2014.1.25
获取操作系统的当前日期,时间
返回值 yyyy-MM-dd hh24:mi:ss
unction GetCurrentTime
{
echo `date +"%Y-%m-%d %H:%M:%S"`;
}
#获取文件的记录数(参数为文件的全路径)
function GetFileLineCount
{
result=0;
if [ -f "$1" ]; then
result=`wc -l "$1" | awk '{print $1}'`;
fi
echo $result;
}
#清空文件内容
function ClearFileContent
{
if [ -f "$1" ]; then
cat /dev/null > "$1";
fi
}
#合并文件
#参数 1:合并的源文件
#参数 2:合并的目标文件
function MergeFile
{
filelen=$(GetFileLineCount $1);
if [ $filelen -gt 0 ]; then
cat $1 >> $2; #写入文件
fi
}
#获取查询语句中的 IN 字符串(文件中指定字段为要变化为 in 的关键数据)
#参数 1:要进行数据格式化的文件路径
#参数 2: 要取数据的数据列数
function GetInData
{
result=`cat $1 | awk 'BEGIN{RS="\r\n"; ORS=", "}{if(length($COLUMN) > 0){print
"'\''"$COLUMN"'\''"}}' COLUMN=$2 | awk '{print substr($0,1, length($0)-2)}'`;
echo $(GetInDataResult "$result");
}
#获取查询语句中的 IN 字符串,多个值用逗号',' 进行分割 (程晓鹏 2014.02.21 add)
#参数 1:字符串
#说明:如参数 1 为:'16, 17, 38, 39',则返回值为 ('16', '17', '38', '39')
function GetInData2
{
result=`echo "$1" | awk 'BEGIN{RS="\n"; ORS=", "} {len=split($0,a,", *"); for(i=1; i<=len; i+
+){if(length(a[i])>0){print "'\''"a[i]"'\''"}}}' | awk '{print substr($0,1, length($0)-2)}'`;
echo $(GetInDataResult "$result");
}
#获取 GetInData 函数的结果值
#参数 1:结果字符串
function GetInDataResult
{
result="$1";
if [ `echo "$result" | wc -c ` -lt 2 ]; then
result="''";
fi
echo "("$result")";
}
#在 oracle 数据库上执行,含有 SQL 语句的数据文件
#参数说明
#参数 1 用户名
#参数 2 密码
#参数 3 TNS 名称
#参数 4 提交的文件全路径
function ExecuteSqlFile
{
linecount=$(GetFileLineCount $4); #获取文件记录数
if [ $linecount -gt 0 ]; then
. ~/.profile;
cmd=`sqlplus $1/$2@$3 <
@$4;
commit;
exit;
EOF`;
fi
}
#判断是否是闰年
#参数 1:年份(四位数字)
#返回值 0:不是闰年;1:是闰年
function IsLeapYear
{
result=`echo "$1" | awk '{print ($1%4==0 && $1%100!=0 || $1%400==0)}'`;
echo $result;
}
#获取含有前缀 0 的字符串[当数字在 0-9 之间时,追加前缀 0]
#参数 1:数字
#返回值:当数据在 0-9 时,追加前缀 0
function Get0Str
{
result=$(Get0StrFormat "$1" 2);
echo "$result";
}

#获取前置 0 的字符串
#参数 1:原始字符串
#参数 2:总长度(int 类型)
#返回值:当原始字符串长度小于总长度,前面补充 0,使其达到总长度
function Get0StrFormat
{
result="";
strlen=`echo "$1" | awk '{print length($0)}'`;
if [ $2 -gt 1 ]; then
if [ $strlen -lt $2 ]; then
i=1;
tmp=`expr "$2" - $strlen | bc`;
while [ $i -le $tmp ]
do
result="0$result";
i=`expr $i + 1 | bc`;
done
fi
result="$result$1";
else
result="$1";
fi
echo "$result";
}

#根据年份,月份,获取该年月的总天数
#参数 1:年份
#参数 2:月份
#返回值,天数
function GetDayCount
{
result=0;
isLeap=$(IsLeapYear "$1");
month=$(GetIntValue "$2"); #对月份值,变成 Int
case "$month" in
4 | 6 | 9 | 11)
result=30;
;;
2)
if [ $isLeap -eq 0 ]; then
result=28;
else
result=29;
fi
;;
*)
result=31;
;;
esac

echo "$result";
}

#获取 Int 类型值


#参数 1:要进行格式化的字符串
function GetIntValue
{
result=`echo "$1" | awk '{print int($0)}'`;
echo $result;
}

#获取指定时间的前某个时间
#参数 1:指定时间(格式:yyyy-MM-dd hh24:mi:ss 如:2014-03-07 09:09:09)
#参数 2:小时数(int 类型)
function GetPreviousDateTimeByHours
{
strdate=`echo "$1" | sed 's/[-: ]//g'`;
intX=`echo "$2" | awk '{print int($1)}'`;

#获取输入参数的年,月,日,时,分,秒数据
intYear0=`echo "$strdate" | awk '{print substr($1, 1, 4)}' | awk '{print int($1)}'`;
intMonth0=`echo "$strdate" | awk '{print substr($1, 5, 2)}' | awk '{print int($1)}'`;
intDay0=`echo "$strdate" | awk '{print substr($1, 7, 2)}' | awk '{print int($1)}'`;
intHour0=`echo "$strdate" | awk '{print substr($1, 9, 2)}' | awk '{print int($1)}'`;
intMinute0=`echo "$strdate" | awk '{print substr($1, 11, 2)}'`;
intSecond0=`echo "$strdate" | awk '{print substr($1, 13, 2)}'`;
intYear1=$intYear0;
intMonth1=$intMonth0;
intDay1=$intDay0;
intHour1=$intHour0;

#进行相关的计算
while [ $intHour1 -le $intX ]
do
if [ $intDay1 -le 1 ]; then
intMonth1=`expr "$intMonth0" - 1 | bc`; #取上个月
if [ $intMonth1 -le 0 ]; then
intDay1=31;
intMonth1=12;
intYear1=`expr "$intYear1" - 1 | bc`;
else
intDay1=$(GetDayCount "$intYear1" "$intMonth1");
fi
else
intDay1=`expr "$intDay1" - 1 | bc`;
fi
#进行累加小时数
intHour1=`expr "$intHour1" + 24 | bc`;
done

#确定最终的小时数
intHour1=`expr "$intHour1" - "$intX" | bc`;

#进行字符格式化
intMonth2=$(Get0Str "$intMonth1");
intDay2=$(Get0Str "$intDay1");
intHour2=$(Get0Str "$intHour1");

result="$intYear1-$intMonth2-$intDay2 $intHour2:$intMinute0:$intSecond0";
echo "$result";
}

#获取指定时间的前某个时间
#参数 1:指定时间(格式:yyyy-MM-dd hh24:mi:ss 如:2014-03-07 09:09:09, 其中时分秒数据
可选)
#参数 2:天数(int 类型)
function GetPreviousDateByDays
{
strdate=`echo "$1" | sed 's/[-: ]//g'`;
strlen=$(GetStrLength "$1");
intX=`echo "$2" | awk '{print int($1)}'`;

#获取输入参数的年,月,日数据
intYear0=`echo "$strdate" | awk '{print substr($1, 1, 4)}' | awk '{print int($1)}'`;
intMonth0=`echo "$strdate" | awk '{print substr($1, 5, 2)}' | awk '{print int($1)}'`;
intDay0=`echo "$strdate" | awk '{print substr($1, 7, 2)}' | awk '{print int($1)}'`;

intYear1=$intYear0;
intMonth1=$intMonth0;
intDay1=$intDay0;

#进行相关的计算
while [ $intDay1 -le $intX ]
do
intMonth1=`expr "$intMonth1" - 1 | bc`;
if [ $intMonth1 -le 0 ]; then
tmpCount=31;
intMonth1=12;
intYear1=`expr "$intYear1" - 1 | bc`;
else
tmpCount=$(GetDayCount "$intYear1" "$intMonth1");
fi
intDay1=`expr "$intDay1" + "$tmpCount" | bc`; #进行天数的累加
done
#计算日期中的天
intDay1=`expr "$intDay1" - "$intX" | bc`;

#进行字符格式化
intMonth2=$(Get0Str "$intMonth1");
intDay2=$(Get0Str "$intDay1");
result="$intYear1-$intMonth2-$intDay2";
if [ $strlen -gt 10 ]; then #当含有时,分,秒数据时,追加上去
strSubLen=`expr "$strlen" - 10 | bc`;
strHMS=`expr substr "$1" 11 "$strSubLen"`;
result="$result$strHMS";
fi
echo "$result";
}

#获取字符串长度
function GetStrLength
{
result=`echo "$1" | awk '{print length($0)}'`;
echo "$result";
}

#获取指定时间的前某个时间
#参数 1:指定时间(格式:yyyy-MM-dd hh24:mi:ss 如:2014-03-07 09:09:09)
#参数 2:计算的单位(DD 天数;HH 小时数)
#参数 3:偏移量值
function GetPreviousDateTime
{
result="";
if [ "$2" = "HH" ]; then
result=$(GetPreviousDateTimeByHours "$1" "$3");
elif [ "$2" = "DD" ]; then
result=$(GetPreviousDateByDays "$1" "$3");
fi
echo "$result;
}