shell脚本名称是:dealData.sh,脚本内容如下:
#设定工作目录
OCRM_HOME=/home1/yqdz/ivms
OCRM_LOG=/home1/yqdz/ivms/log#添加ORACLE环境变量
. /home1/oracle/.profileIVMS_ROOT="/home1/yqdz/ivms"
DB_String="yqdz/yqdz"
BTC_INMPORTDATA=${IVMS_ROOT}/sql/BTC_INMPORTDATA.sql
BTC_RECKONAVR=${IVMS_ROOT}/sql/BTC_RECKONAVR.sql
btc_importdetaildata=${IVMS_ROOT}/sql/btc_importdetaildata.sql
btc_importintocheckdata=${IVMS_ROOT}/sql/btc_importintocheckdata.sql
btc_setkeystone=${IVMS_ROOT}/sql/btc_setkeystone.sql#ftp 取数据 需要用户名和密码
ftpget()
{
if [ $# != 4 ]
then
echo " Usage userid username dir fileName"
exit 0
fi echo "开始连接FTP服务器">"$OCRM_LOG"/log.txt
ftp -niv 88.0.51.17 << EOF prompt
user $1 $2
#hash
bin
lcd "$OCRM_HOME"/data
cd $3
get $4
bye
EOF
}#oracle 修改数据库标志 需要用户名和密码
updateData()
{
if [ $# != 1 ]
then
echo " Usage userid/username "
exit 0
fi sqlplus $1 << EOF
UPDATE t_sys_param SET param_value ='1' WHERE trim(param_id)='OCRM_RADY_FLAG' and trim(param_value)='0';
commit ;
exit
EOF
}#取某一时间前几天的时间
# 参数1 某一时间 参数2 相隔几天GetPrevDate()
{
str=$1
days=$2
yy=`echo $str|cut -c 1-4`
mm=`echo $str|cut -c 5-6`
dd=`echo $str|cut -c 7-8`
sav_dd=$days
days=`expr $days - $dd`
while [ $days -ge 0 ]
do
mm=`expr $mm - 1`
[ $mm -eq 0 ] && mm=12 && yy=`expr $yy - 1`
aaa=`cal $mm $yy`
bbb=`echo $aaa|awk '{print $NF}'`
days=`expr $days - $bbb`
done
dd=`expr 0 - $days`
expr $dd : "^.$" > /dev/null && dd=0$dd
expr $mm : "^.$" > /dev/null && mm=0$mm
echo $yy$mm$dd
}
#oracle 清空临时表 需要用户名和密码
truncatTable()
{
if [ $# != 1 ]
then
echo " Usage userid/username "
exit 0
fi
sqlplus $1 << EOF
@$OCRM_HOME/sql/truncatTable.sql
EOF
}#解压文件 (.tar.Z格式)
unCompData()
{
echo "======$1"
if [ -f "$1".tar.Z ]
then
if [ -d $DATESTR ]
then
echo " $DATESTR is dealdate "
else
mkdir $DATESTR
fi
cp "$1".tar.Z $DATESTR/
rm -f "$1".tar
uncompress -f "$1".tar.Z
tar -xvf "$1".tar
rm "$1".tar
else
echo "$1 数据不存在 " >>"$OCRM_LOG"/log.txt
fi}#开始
#判断运行标志
if [ "$HADRUN" = "1" ]
then
echo "program is already run......"
exit
fi#开始运行
HADRUN=1
export HADRUN
SENDSTR=BTZMX0002"$DATESTR"a002 #核心数据#生成标志位
FLAG=`mds s $SENDSTR 1|awk -F '|' '{print($11)}'` #核心系统标志
#判断数据是否已经生成
while [ -z "$FLAG" ]||[ "$FLAG" = "0" ]
do
echo "wait 10 secends at "`date +"%Y/%m/%d %H:%M:%S"`>>"$OCRM_LOG"/log.txt
sleep 10
FLAG=`mds s $SENDSTR 1|awk -F '|' '{print($11)}'`
done#ftp取数据
#核心系统数据
ftpget ua002 ua002 "data/$DATESTR" "A002_A002$DATESTR.tar.Z" >>"$OCRM_LOG"/log.txt
cd /home1/oracle/ocrmdata/sh/data
if [ -d A002 ]
then
rm -r -f A002
fi
rm -f *.txt
#解压核心数据
FILENAME=A002_A002$DATESTR
unCompData "$FILENAME"mv "$OCRM_HOME"/data/A002/A002/* "$OCRM_HOME"/data#修改核心文件文件名
FILESET=`ls *.txt`
echo $FILESET
for FILE in $FILESET
do
OLDFILE=$FILE
TMP=`echo $FILE|cut -b1-5`
FILE="$TMP".txt
mv "$OCRM_HOME"/data/$OLDFILE "$OCRM_HOME"/data/$FILE
done
#清空数据
truncatTable yqdz/yqdz#导入数据
FILESET="
adkfh.sh\
bdgkh.sh\
aghfh.sh\
agdfh.sh\
aghmx.sh\
agdmx.sh
"
echo "脚本文件是$FILESET"
for FILE in $FILESET
do
echo "正在处理"$OCRM_HOME"/sh/$FILE" >>"$OCRM_LOG"/log.txt
"$OCRM_HOME"/sh/$FILE >>"$OCRM_LOG"/log.txt
done
#更新数据库标志位#updateData yqdz/yqdz >>"$OCRM_LOG"/log.txt #记录数据日志LOG="数据处理完毕: "`date +"%Y-%m-%d %H:%M:%S" `
TMPDATE=`GetPrevDate "$DATESTR" 200 `
echo "$TMPDATE ==================删除历史数据日期"
cd "$OCRM_HOME"/data
if [ -d $TMPDATE ]
then
rm -r -f $TMPDATE
fiecho $LOG >>"$OCRM_LOG"/log.txtBTC_RECKONAVR
#如果是当月一号,备份上月日均数据,将basecheckdata表中数据重新插入到日均表
sqlplus ${DB_String} ${BTC_RECKONAVR}
#向基本表(basecheckdata)中导入数据
sqlplus ${DB_String} ${BTC_INMPORTDATA}
#导入明细数据
sqlplus ${DB_String} ${btc_importdetaildata}
#从基本表(basecheckdata)向btc_checkdata表中导入数据
sqlplus ${DB_String} ${btc_importintocheckdata}
#设置重点标志
sqlplus ${DB_String} ${btc_setkeystone}#修改运行标志HADRUN=0在ksh下运行出错:
dealData.sh[4]: ^M: not found.
dealData.sh[6]: /home1/oracle/.profile^M: not found.
第一个错误完全不明白,第二个错误应该是说找不到/home1/oracle/.profile文件吧,可是/home1/oracle/目录下明明有.profile文件啊,请大家帮忙看看这个到底该怎么解决啊?本人初次接触shell,急啊。
#设定工作目录
OCRM_HOME=/home1/yqdz/ivms
OCRM_LOG=/home1/yqdz/ivms/log#添加ORACLE环境变量
. /home1/oracle/.profileIVMS_ROOT="/home1/yqdz/ivms"
DB_String="yqdz/yqdz"
BTC_INMPORTDATA=${IVMS_ROOT}/sql/BTC_INMPORTDATA.sql
BTC_RECKONAVR=${IVMS_ROOT}/sql/BTC_RECKONAVR.sql
btc_importdetaildata=${IVMS_ROOT}/sql/btc_importdetaildata.sql
btc_importintocheckdata=${IVMS_ROOT}/sql/btc_importintocheckdata.sql
btc_setkeystone=${IVMS_ROOT}/sql/btc_setkeystone.sql#ftp 取数据 需要用户名和密码
ftpget()
{
if [ $# != 4 ]
then
echo " Usage userid username dir fileName"
exit 0
fi echo "开始连接FTP服务器">"$OCRM_LOG"/log.txt
ftp -niv 88.0.51.17 << EOF prompt
user $1 $2
#hash
bin
lcd "$OCRM_HOME"/data
cd $3
get $4
bye
EOF
}#oracle 修改数据库标志 需要用户名和密码
updateData()
{
if [ $# != 1 ]
then
echo " Usage userid/username "
exit 0
fi sqlplus $1 << EOF
UPDATE t_sys_param SET param_value ='1' WHERE trim(param_id)='OCRM_RADY_FLAG' and trim(param_value)='0';
commit ;
exit
EOF
}#取某一时间前几天的时间
# 参数1 某一时间 参数2 相隔几天GetPrevDate()
{
str=$1
days=$2
yy=`echo $str|cut -c 1-4`
mm=`echo $str|cut -c 5-6`
dd=`echo $str|cut -c 7-8`
sav_dd=$days
days=`expr $days - $dd`
while [ $days -ge 0 ]
do
mm=`expr $mm - 1`
[ $mm -eq 0 ] && mm=12 && yy=`expr $yy - 1`
aaa=`cal $mm $yy`
bbb=`echo $aaa|awk '{print $NF}'`
days=`expr $days - $bbb`
done
dd=`expr 0 - $days`
expr $dd : "^.$" > /dev/null && dd=0$dd
expr $mm : "^.$" > /dev/null && mm=0$mm
echo $yy$mm$dd
}
#oracle 清空临时表 需要用户名和密码
truncatTable()
{
if [ $# != 1 ]
then
echo " Usage userid/username "
exit 0
fi
sqlplus $1 << EOF
@$OCRM_HOME/sql/truncatTable.sql
EOF
}#解压文件 (.tar.Z格式)
unCompData()
{
echo "======$1"
if [ -f "$1".tar.Z ]
then
if [ -d $DATESTR ]
then
echo " $DATESTR is dealdate "
else
mkdir $DATESTR
fi
cp "$1".tar.Z $DATESTR/
rm -f "$1".tar
uncompress -f "$1".tar.Z
tar -xvf "$1".tar
rm "$1".tar
else
echo "$1 数据不存在 " >>"$OCRM_LOG"/log.txt
fi}#开始
#判断运行标志
if [ "$HADRUN" = "1" ]
then
echo "program is already run......"
exit
fi#开始运行
HADRUN=1
export HADRUN
SENDSTR=BTZMX0002"$DATESTR"a002 #核心数据#生成标志位
FLAG=`mds s $SENDSTR 1|awk -F '|' '{print($11)}'` #核心系统标志
#判断数据是否已经生成
while [ -z "$FLAG" ]||[ "$FLAG" = "0" ]
do
echo "wait 10 secends at "`date +"%Y/%m/%d %H:%M:%S"`>>"$OCRM_LOG"/log.txt
sleep 10
FLAG=`mds s $SENDSTR 1|awk -F '|' '{print($11)}'`
done#ftp取数据
#核心系统数据
ftpget ua002 ua002 "data/$DATESTR" "A002_A002$DATESTR.tar.Z" >>"$OCRM_LOG"/log.txt
cd /home1/oracle/ocrmdata/sh/data
if [ -d A002 ]
then
rm -r -f A002
fi
rm -f *.txt
#解压核心数据
FILENAME=A002_A002$DATESTR
unCompData "$FILENAME"mv "$OCRM_HOME"/data/A002/A002/* "$OCRM_HOME"/data#修改核心文件文件名
FILESET=`ls *.txt`
echo $FILESET
for FILE in $FILESET
do
OLDFILE=$FILE
TMP=`echo $FILE|cut -b1-5`
FILE="$TMP".txt
mv "$OCRM_HOME"/data/$OLDFILE "$OCRM_HOME"/data/$FILE
done
#清空数据
truncatTable yqdz/yqdz#导入数据
FILESET="
adkfh.sh\
bdgkh.sh\
aghfh.sh\
agdfh.sh\
aghmx.sh\
agdmx.sh
"
echo "脚本文件是$FILESET"
for FILE in $FILESET
do
echo "正在处理"$OCRM_HOME"/sh/$FILE" >>"$OCRM_LOG"/log.txt
"$OCRM_HOME"/sh/$FILE >>"$OCRM_LOG"/log.txt
done
#更新数据库标志位#updateData yqdz/yqdz >>"$OCRM_LOG"/log.txt #记录数据日志LOG="数据处理完毕: "`date +"%Y-%m-%d %H:%M:%S" `
TMPDATE=`GetPrevDate "$DATESTR" 200 `
echo "$TMPDATE ==================删除历史数据日期"
cd "$OCRM_HOME"/data
if [ -d $TMPDATE ]
then
rm -r -f $TMPDATE
fiecho $LOG >>"$OCRM_LOG"/log.txtBTC_RECKONAVR
#如果是当月一号,备份上月日均数据,将basecheckdata表中数据重新插入到日均表
sqlplus ${DB_String} ${BTC_RECKONAVR}
#向基本表(basecheckdata)中导入数据
sqlplus ${DB_String} ${BTC_INMPORTDATA}
#导入明细数据
sqlplus ${DB_String} ${btc_importdetaildata}
#从基本表(basecheckdata)向btc_checkdata表中导入数据
sqlplus ${DB_String} ${btc_importintocheckdata}
#设置重点标志
sqlplus ${DB_String} ${btc_setkeystone}#修改运行标志HADRUN=0在ksh下运行出错:
dealData.sh[4]: ^M: not found.
dealData.sh[6]: /home1/oracle/.profile^M: not found.
第一个错误完全不明白,第二个错误应该是说找不到/home1/oracle/.profile文件吧,可是/home1/oracle/目录下明明有.profile文件啊,请大家帮忙看看这个到底该怎么解决啊?本人初次接触shell,急啊。
/home1/oracle/.profile^M: not found.
都是因为行尾多了^M,有时候用UE编辑之后传到UNXI会出现这样的问题
第一是要FTP用BIN的方式来传输
第二是若上传后仍然有这样的问题,就用VI打开然后手动删除