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,急啊。

解决方案 »

  1.   

    那一定是你这个文件是经过不同的编辑器编辑的结果,^M是回车换行符中的一个,unix中只需要^J就行了,不需要^M,你用vi打开文件,把它删除了就行了。
      

  2.   

    估计是ftp的时候以二进制方式上传到了unix或linux上面了。用ascii方式重新传一遍再试试。
      

  3.   

    第二个错误与第一个错误其实是一码事情:
     /home1/oracle/.profile^M:  not found. 
    都是因为行尾多了^M,有时候用UE编辑之后传到UNXI会出现这样的问题
    第一是要FTP用BIN的方式来传输
    第二是若上传后仍然有这样的问题,就用VI打开然后手动删除