免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Shell $?问题
12下一页
最近访问板块 发新帖
查看: 4832 | 回复: 15
打印 上一主题 下一主题

$?问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-05 20:02 |只看该作者 |倒序浏览
rman target / nocatalog<<EOF>>$BACK_LOG/backup.log

crosscheck archivelog all;
crosscheck backup;

run {
allocate channel c1 type disk maxpiecesize 50G;
backup database format '$BACK_DATA/FULL_%d_DB_%T_%U' plus
archivelog delete all input
format '$BACK_DATA/FULL_%d_LOG_%T_%U';
release channel c1;
}

delete noprompt expired backup;
delete noprompt obsolete ;

exit;
EOF

if [ "$?" -eq 0 ]; then
   echo "删除昨天备份[${DEL_DATA}]" | tee -a $BACK_LOG/backup.log
   rm -rf ${DEL_DATA}/*
   echo "------------------------------------------------------------">>$BACK_LOG/backup.log
   echo "---------------------$week_day数据库备份完毕----------------" | tee -a $BACK_LOG/backup.log
   echo "------------------------------------------------------------">>$BACK_LOG/backup.log
else
   echo "------------------------------------------------------------">>$BACK_LOG/backup.log
   echo "---------------------$week_day数据库备份不成功--------------" | tee -a $BACK_LOG/backup.log
   echo "------------------------------------------------------------">>$BACK_LOG/backup.log
fi

上面是oracle数据库rman备份数据库的shell脚本的一部分,我想问问,如果rman某个命令错误,是不是$?都会返回非0?

谢谢

论坛徽章:
0
2 [报告]
发表于 2011-07-05 23:35 |只看该作者
回复 1# guoq.lee


    $? 判断的是上一条命令的执行结果,在这里应该判断的是:
rman target / nocatalog<<EOF>>$BACK_LOG/backup.log

crosscheck archivelog all;
crosscheck backup;

run {
allocate channel c1 type disk maxpiecesize 50G;
backup database format '$BACK_DATA/FULL_%d_DB_%T_%U' plus
archivelog delete all input
format '$BACK_DATA/FULL_%d_LOG_%T_%U';
release channel c1;
}

delete noprompt expired backup;
delete noprompt obsolete ;

exit;
EOF

在这样的操作中,oracle 语句错误会导致上条命令执行不成功,所以,应该会返回非0

论坛徽章:
0
3 [报告]
发表于 2011-07-05 23:36 |只看该作者
回复 1# guoq.lee


晕了,这个完全可以自己测试一下嘛....
在EOF后面添加一条:result=$? ;echo $result 或者直接echo $? 下面的语句先注释掉。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
4 [报告]
发表于 2011-07-06 08:17 |只看该作者
$?返回什么值
exec rman前由shell决定
exec rman后由rman决定

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
5 [报告]
发表于 2011-07-06 08:28 |只看该作者
回复 2# 南极雨


只要 rman target / nocatalog 执行成功了
就会返回 0 ,无论 <<EOF 里面的子命令是否执行成功
shell 只返回它执行的命令的结果
<<EOF 中的命令是属于 rman 命令的
不归 shell 管

论坛徽章:
0
6 [报告]
发表于 2011-07-06 09:32 |只看该作者
本帖最后由 南极雨 于 2011-07-06 09:43 编辑

回复 5# ly5066113

你确定?
你的理解也对!
oracle也有自己的一套报错机制,rman 命令执行成功不成功需要看这些个oracle语句是否执行成功,如果执行不成功,那么rman也会失败!

欢迎指正!

  1. [root@center ~]# cat test
  2. $!/bin/bash

  3. mysql -proot <<EOF
  4. use mysql;
  5. select * from user;
  6. [color=Black][color=Red]#these two rows below are not mysql command
  7. aljwdisd
  8. adadas[/color][/color]

  9. exit;
  10. EOF

  11. echo -e "\n\n\n\n\n$?"


  12. [root@center ~]# ./test
  13. [root@center ~]# exit
  14. exit
  15. Host    User    Password        Select_priv     Insert_priv     Update_priv     Delete_priv     Create_priv     Drop_priv       Reload_priv Shutdown_priv    Process_priv    File_priv       Grant_priv      References_priv Index_priv      Alter_priv      Show_db_priv    Super_priv  Create_tmp_table_priv    Lock_tables_priv        Execute_priv    Repl_slave_priv Repl_client_priv        Create_view_priv        Show_view_priv       Create_routine_priv     Alter_routine_priv      Create_user_priv        Event_priv      Trigger_priv    ssl_type        ssl_cipher  x509_issuer      x509_subject    max_questions   max_updates     max_connections max_user_connections
  16. localhost       root    *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B       Y       Y       Y       Y       Y       Y       Y       Y       Y   YY       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y   00       0       0
  17. nagios.rmgnetworks.com  root            Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y   YY       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y                                   00       0       0
  18. 127.0.0.1       root            Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y   YY       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y                                       0   00       0
  19. localhost                       N       N       N       N       N       N       N       N       N       N       N       N       N       N   NN       N       N       N       N       N       N       N       N       N       N       N       N                                       0   00       0
  20. nagios.rmgnetworks.com                  N       N       N       N       N       N       N       N       N       N       N       N       N   NN       N       N       N       N       N       N       N       N       N       N       N       N       N                                   00       0       0
  21. %       root    *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y   YY       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y           00       0       0
  22. ERROR 1064 (42000) at line 4: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'aljwdisd
  23. adadas

  24. exit' at line 1




  25. [color=Red]
  26. 1[/color]
复制代码

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
7 [报告]
发表于 2011-07-06 09:46 |只看该作者
回复 6# 南极雨


就像waker所讲的,当执行了 mysql 后,返回值是什么,完全是由 mysql 这个命令决定的。
但一般这类命令是会返回 0 的,就像我们常用的 ftp 、 rsh 等
可能 mysql 命令设计的比较人性化,它的内部错误也会返回1
像Oracle的sqlplus就不可以,内部sql错误也会返回0,只要sqlplus运行成功

论坛徽章:
0
8 [报告]
发表于 2011-07-06 09:48 |只看该作者
回复 7# ly5066113


我去验证下...

论坛徽章:
0
9 [报告]
发表于 2011-07-06 10:21 |只看该作者
回复 7# ly5066113


   可以指定"whenever sqlerror exit 1"让它返回非0值,后面通过shell的$?来判断sqlplus里面的语句是否执行成功

论坛徽章:
0
10 [报告]
发表于 2011-07-06 10:25 |只看该作者
本帖最后由 南极雨 于 2011-07-06 10:27 编辑

回复 7# ly5066113


    这个是我的执行的结果(哈哈,oracle好像也挺人性化的,只要有ERROR就会返回1):
  1. [oracle@rhel5-10g ~]$ rman target / <<EOF
  2. > crosscheck archivelog all;
  3. > crosscheck aaaa;
  4. > exit;
  5. > EOF
  6. echo $?
  7. Recovery Manager: Release 10.2.0.1.0 - Production on Wed Jul 6 17:47:09 2011

  8. Copyright (c) 1982, 2005, Oracle.  All rights reserved.


  9. connected to target database: WNBUS (DBID=1948819613)

  10. RMAN>
  11. using target database control file instead of recovery catalog
  12. allocated channel: ORA_DISK_1
  13. channel ORA_DISK_1: sid=138 devtype=DISK
  14. validation succeeded for archived log
  15. archive log filename=+DG2/wnbus/archivelog/2011_02_28/thread_1_seq_2.260.744326287 recid=1 stamp=744326300
  16. validation succeeded for archived log
  17. archive log filename=+DG2/wnbus/archivelog/2011_03_09/thread_1_seq_3.261.745308421 recid=2 stamp=745308433
  18. validation succeeded for archived log
  19. archive log filename=+DG2/wnbus/archivelog/2011_03_15/thread_1_seq_4.264.745884549 recid=3 stamp=745884550
  20. validation succeeded for archived log
  21. archive log filename=+DG2/wnbus/archivelog/2011_03_15/thread_1_seq_5.265.745885039 recid=4 stamp=745885040
  22. validation succeeded for archived log
  23. archive log filename=+DG2/wnbus/archivelog/2011_03_15/thread_1_seq_6.266.745885089 recid=5 stamp=745885089
  24. validation succeeded for archived log
  25. archive log filename=+DG2/wnbus/archivelog/2011_03_21/thread_1_seq_7.267.746392411 recid=6 stamp=746392412
  26. validation succeeded for archived log
  27. archive log filename=+DG2/wnbus/archivelog/2011_04_01/thread_1_seq_8.268.747336983 recid=7 stamp=747336990
  28. validation succeeded for archived log
  29. archive log filename=+DG2/wnbus/archivelog/2011_04_02/thread_1_seq_9.269.747423655 recid=8 stamp=747423669
  30. validation succeeded for archived log
  31. archive log filename=+DG2/wnbus/archivelog/2011_04_11/thread_1_seq_10.270.748151263 recid=9 stamp=748151275
  32. validation succeeded for archived log
  33. archive log filename=+DG2/wnbus/archivelog/2011_04_11/thread_1_seq_11.271.748220487 recid=10 stamp=748220488
  34. validation succeeded for archived log
  35. archive log filename=+DG2/wnbus/archivelog/2011_04_12/thread_1_seq_12.272.748288347 recid=11 stamp=748288354
  36. validation succeeded for archived log
  37. archive log filename=+DG2/wnbus/archivelog/2011_04_13/thread_1_seq_13.273.748370181 recid=12 stamp=748370191
  38. validation succeeded for archived log
  39. archive log filename=+DG2/wnbus/archivelog/2011_04_18/thread_1_seq_14.274.748802407 recid=13 stamp=748802407
  40. validation succeeded for archived log
  41. archive log filename=+DG2/wnbus/archivelog/2011_04_25/thread_1_seq_15.275.749422207 recid=14 stamp=749422213
  42. validation succeeded for archived log
  43. archive log filename=+DG2/wnbus/archivelog/2011_06_08/thread_1_seq_16.276.753297211 recid=15 stamp=753297222
  44. validation succeeded for archived log
  45. archive log filename=+DG2/wnbus/archivelog/2011_07_06/thread_1_seq_17.277.755804785 recid=16 stamp=755804797
  46. Crosschecked 16 objects


  47. RMAN>
  48. RMAN-00571: ===========================================================
  49. RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
  50. RMAN-00571: ===========================================================
  51. RMAN-00558: error encountered while parsing input commands
  52. RMAN-01009: syntax error: found "identifier": expecting one of: "archivelog, backup, backuppiece, backupset, copy, controlfilecopy, datafilecopy, proxy"
  53. RMAN-01008: the bad identifier was: aaaa
  54. RMAN-01007: at line 1 column 12 file: standard input

  55. RMAN-00571: ===========================================================
  56. RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
  57. RMAN-00571: ===========================================================
  58. RMAN-00558: error encountered while parsing input commands
  59. RMAN-01009: syntax error: found ";": expecting one of: "allocate, alter, backup, beginline, blockrecover, catalog, change, connect, copy, convert, create, crosscheck, configure, duplicate, debug, delete, drop, exit, endinline, flashback, host, {, library, list, mount, open, print, quit, recover, register, release, replace, report, renormalize, reset, restore, resync, rman, run, rpctest, set, setlimit, sql, switch, spool, startup, shutdown, send, show, test, transport, upgrade, unregister, validate"
  60. RMAN-01007: at line 1 column 16 file: standard input

  61. RMAN>

  62. Recovery Manager complete.
  63. [oracle@rhel5-10g ~]$ echo $?
  64. 1
  65. [oracle@rhel5-10g ~]$
复制代码
  1. $Bsstest2/oracle>rman target /

  2. Recovery Manager: Release 10.2.0.4.0 - Production on Wed Jul 6 10:10:48 2011

  3. Copyright (c) 1982, 2007, Oracle.  All rights reserved.

  4. connected to target database: TEST (DBID=2048592585)

  5. RMAN>

  6. RMAN>

  7. RMAN>

  8. RMAN>

  9. RMAN> crosscheck archivelog all;

  10. using target database control file instead of recovery catalog
  11. allocated channel: ORA_DISK_1
  12. channel ORA_DISK_1: sid=49 devtype=DISK
  13. specification does not match any archive log in the recovery catalog

  14. RMAN> crosscheck aaaa;

  15. RMAN-00571: ===========================================================
  16. RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
  17. RMAN-00571: ===========================================================
  18. RMAN-00558: error encountered while parsing input commands
  19. RMAN-01009: syntax error: found "identifier": expecting one of: "archivelog, backup, backuppiece, backupset, copy, controlfilecopy, datafilecopy, proxy"
  20. RMAN-01008: the bad identifier was: aaaa
  21. RMAN-01007: at line 1 column 12 file: standard input

  22. RMAN-00571: ===========================================================
  23. RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
  24. RMAN-00571: ===========================================================
  25. RMAN-00558: error encountered while parsing input commands
  26. RMAN-01009: syntax error: found ";": expecting one of: "allocate, alter, backup, beginline, blockrecover, catalog, change, connect, copy, convert, create, crosscheck, configure, duplicate, debug, delete, drop, exit, endinline, flashback, host, {, library, list, mount, open, print, quit, recover, register, release, replace, report, renormalize, reset, restore, resync, rman, run, rpctest, set, setlimit, sql, switch, spool, startup, shutdown, send, show, test, transport, upgrade, unregister, validate"
  27. RMAN-01007: at line 1 column 16 file: standard input

  28. RMAN>

  29. RMAN>

  30. RMAN> exit


  31. Recovery Manager complete.
  32. $Bsstest2/oracle>echo $?
  33. 1
复制代码
  1. $Bsstest2/oracle>
  2. $Bsstest2/oracle>rman target / <<EOF
  3. > crosscheck archivelog all;
  4. > exit;
  5. > EOF

  6. Recovery Manager: Release 10.2.0.4.0 - Production on Wed Jul 6 10:12:08 2011

  7. Copyright (c) 1982, 2007, Oracle.  All rights reserved.

  8. connected to target database: TEST (DBID=2048592585)

  9. RMAN>
  10. using target database control file instead of recovery catalog
  11. allocated channel: ORA_DISK_1
  12. channel ORA_DISK_1: sid=49 devtype=DISK
  13. specification does not match any archive log in the recovery catalog

  14. RMAN>

  15. Recovery Manager complete.
  16. $Bsstest2/oracle>echo $?
  17. 0
  18. $Bsstest2/oracle>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP