免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8290 | 回复: 9
打印 上一主题 下一主题

运行脚本时,前面加不加sh有什么区别? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-17 19:39 |只看该作者 |倒序浏览
我有一段脚本
opserdb>ls -l refresh_table
-rwxr-xr-x   1 opserdb  staff       5234 Jan 17 09:43 refresh_table

本身可以自己执行,而且结果正确
opserdb>refresh_table eden_flat_ord_cmpt_fr.sql edenfr edenfr_2004

如果脚本前面加sh运行,则出错
opserdb>sh refresh_table eden_flat_ord_cmpt_fr.sql edenfr edenfr_2004
错误:refresh_table: test: argument expected

请问这两种方式运行有什么区别吗?

请高手指点。谢谢!

论坛徽章:
0
2 [报告]
发表于 2005-01-17 19:43 |只看该作者

运行脚本时,前面加不加sh有什么区别?

该脚本主要是根据传入的参数去刷新一张表,并纪录相应的日志信息。包含两个函数,rfsh_env和rfsh_refresh

opserdb>cat refresh_table

#!/usr/bin/bash

rfsh_env()
{
LOG_PATH=/erdb/log
LOG_FILE=refresh_log.`date "+%Y-%m-%d"`
LOG_DETAIL=log_detail.$SCHEMA.`date "+%Y-%m-%d"`
USERNAME=eden
PASSWORD=eden
DATABASE=perdb
}

rfsh_refresh()
{
TABLE_NAME=`echo ${1%_*}|cut -d"/" -f 3`

LOG_ROWS=`sqlplus -s $USERNAME/$PASSWORD@$DATABASE<<EOF
        SET FEED OFF
        SET TERM OFF
        SET HEAD OFF
        SELECT count(*)
          FROM eden_refr_log
          WHERE user_nam='$SCHEMA'
          AND obj_nam='$TABLE_NAME';
EOF`

if [ $LOG_ROWS -eq 0 ]; then
  REFRESH_SEQ=1
else
  REFRESH_SEQ=`sqlplus -s $USERNAME/$PASSWORD@$DATABASE<<EOF
        SET FEED OFF
        SET TERM OFF
        SET HEAD OFF
        SELECT max(refr_seq_nb+1)
          FROM eden_refr_log
          WHERE user_nam='$SCHEMA'
          AND obj_nam='$TABLE_NAME';
EOF`
fi

BEFORE_ROWS=`sqlplus -s $USERNAME/$PASSWORD@$DATABASE<<EOF
        SET FEED OFF
        SET TERM OFF
        SET HEAD OFF
        select count(*) from $SCHEMA.$TABLE_NAME;
EOF`

START_TIME=`date "+%Y-%m-%d %H:%M:%S"`

echo "-----------------------------------------">>$LOG_PATH/$LOG_DETAIL
echo "start refreshing $TABLE_NAME ..." >>$LOG_PATH/$LOG_DETAIL
echo "-----------------------------------------">>$LOG_PATH/$LOG_DETAIL
sqlplus -s $SCHEMA/$SCHEMA_PASS@$DATABASE>>$LOG_PATH/$LOG_DETAIL<<EOF
  
  INSERT INTO $USERNAME.eden_refr_log(user_nam,obj_nam,obj_type,refr_seq_nb,strt_dat_tim,rows_bef_refr)
  VALUES('${SCHEMA}','${TABLE_NAME}','T',${REFRESH_SEQ},sysdate,$BEFORE_ROWS);
  COMMIT;


  spool /tmp/$SCHEMA_$TABLE_NAME.out
  @$FILE_NAME
  spool off

  UPDATE $USERNAME.eden_refr_log
    SET end_dat_tim=sysdate
    WHERE user_nam='$SCHEMA'
    AND obj_nam='$TABLE_NAME'
    AND refr_seq_nb=$REFRESH_SEQ;
  COMMIT;

  EXIT;
EOF

END_TIME=`date "+%Y-%m-%d %H:%M:%S"`

ERRORMSG=`cat /tmp/$SCHEMA_$TABLE_NAME.out|grep ORA-|head -n 1`

ERR_COUNT=`cat /tmp/$SCHEMA_$TABLE_NAME.out|grep ORA-|wc -l`

if [ $ERR_COUNT -eq 0 ]; then
  REFRESH_STATUS='Y'
  RETURN_VAL=0
else
  REFRESH_STATUS='N'
  RETURN_VAL=1
fi

sqlplus -s $USERNAME/$PASSWORD@$DATABASE>>$LOG_PATH/$LOG_DETAIL<<EOF
  UPDATE eden_refr_log
    SET sta_cod='$REFRESH_STATUS',
        tot_drtn_tim=( end_dat_tim - strt_dat_tim )*3600*24,
        err_txt='$ERRORMSG'
    WHERE user_nam='$SCHEMA'
    AND obj_nam='$TABLE_NAME'
    AND refr_seq_nb=$REFRESH_SEQ;
  COMMIT;

  EXIT;
EOF

AFTER_ROWS=`sqlplus -s $USERNAME/$PASSWORD@$DATABASE<<EOF
  SET FEED OFF
  SET TERM OFF
  SET HEAD OFF
  select count(*) from $SCHEMA.$TABLE_NAME;
EOF`

sqlplus -s $USERNAME/$PASSWORD@$DATABASE>>$LOG_PATH/$LOG_DETAIL<<EOF
  UPDATE eden_refr_log
    SET          rows_aft_refr=$AFTER_ROWS
    WHERE user_nam='$SCHEMA'
    AND obj_nam='$TABLE_NAME'
    AND refr_seq_nb=$REFRESH_SEQ;
  COMMIT;

  EXIT;
EOF

echo "owner: "$SCHEMA>>$LOG_PATH/$LOG_FILE
echo "table name: "$TABLE_NAME>>$LOG_PATH/$LOG_FILE
echo "start time: "$START_TIME>>$LOG_PATH/$LOG_FILE
echo "end time: "$END_TIME>>$LOG_PATH/$LOG_FILE
echo "rows before refresh: "$BEFORE_ROWS>>$LOG_PATH/$LOG_FILE
echo "rows after refresh: "$AFTER_ROWS>>$LOG_PATH/$LOG_FILE
echo "refresh succeed(Y/N): "$REFRESH_STATUS>>$LOG_PATH/$LOG_FILE
echo "error messages if any: "$ERRORMSG>>$LOG_PATH/$LOG_FILE
echo " ">>$LOG_PATH/$LOG_FILE
echo " ">>$LOG_PATH/$LOG_FILE
}


#################################
## Main
#################################

if [ $# -lt 3 ]; then
  echo " "
  echo "Usage: refresh_table SQL_FILE_NAME SCHEMA SCHEMA_PASS"
  echo " "
  exit 1
fi

FILE_NAME=`echo $1|tr "[A-Z]" "[a-z]"`
FILE_NAME=../sql/$FILE_NAME
SCHEMA=`echo $2|tr "[A-Z]" "[a-z]"`
SCHEMA_PASS=`echo $3|tr "[A-Z]" "[a-z]"`

if [ ! -e $FILE_NAME ]; then
  echo " "
  echo "File $FILE_NAME does NOT exist."
  echo "lease specify an existed SQL file."
  echo " "
  echo " ">>$LOG_PATH/$LOG_FILE
  echo "----------------------------------">>$LOG_PATH/$LOG_FILE
  echo "  REFRESHING `echo ${1%_*}|cut -d"/" -f 3` ...">>$LOG_PATH/$LOG_FILE
  echo "----------------------------------">>$LOG_PATH/$LOG_FILE
  echo "File $FILE_NAME does NOT exist! ">>$LOG_PATH/$LOG_FILE
  exit 1
fi

rfsh_env

rfsh_refresh $FILE_NAME $SCHEMA $SCHEMA_PASS

if [ $RETURN_VAL -eq 1 ]; then
  echo ""
  echo "Errors during refresh table $TABLE_NAME."
  echo ""
fi

exit $RETURN_VAL

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2005-01-17 19:58 |只看该作者

运行脚本时,前面加不加sh有什么区别?

你的sh是/usr/bin/bash么?
/usr/bin/bash urscript
理论上讲,直接运行脚本和把脚本当成shell的一个参数没什么区别:
./urscript
等同
sh ./urscript
这方面的介绍,请参阅置顶netman的shell十三问

论坛徽章:
0
4 [报告]
发表于 2005-01-17 20:01 |只看该作者

运行脚本时,前面加不加sh有什么区别?

你的脚本是bash脚本,其中有sh不支持的语句,你强制用sh执行,自然抱错

论坛徽章:
0
5 [报告]
发表于 2005-01-17 20:05 |只看该作者

运行脚本时,前面加不加sh有什么区别?

那怎么改正呢? 还请指点

谢谢!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-01-17 20:10 |只看该作者

运行脚本时,前面加不加sh有什么区别?

ln -s /usr/bin/bash /bin/sh

论坛徽章:
0
7 [报告]
发表于 2005-01-17 20:18 |只看该作者

运行脚本时,前面加不加sh有什么区别?

谢谢烈火兄,不过还有问题,ln时出错

opserdb>ln -s /usr/bin/bash /bin/sh
ln: cannot create /bin/sh: File exists

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2005-01-17 20:31 |只看该作者

运行脚本时,前面加不加sh有什么区别?

原帖由 "zhyuh" 发表:
谢谢烈火兄,不过还有问题,ln时出错

opserdb>ln -s /usr/bin/bash /bin/sh
ln: cannot create /bin/sh: File exists

那是因为/bin/sh已经存在.那就直接用绝对路径执行你的脚本
/usr/bin/bash /path/urscript

论坛徽章:
0
9 [报告]
发表于 2005-01-17 20:40 |只看该作者

运行脚本时,前面加不加sh有什么区别?

一定要在前面加SHELL调用,就加bash:
bash refresh_table

论坛徽章:
0
10 [报告]
发表于 2005-01-17 21:48 |只看该作者

运行脚本时,前面加不加sh有什么区别?

原来这样,谢谢各位!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP