ITPub博客

首页 > 数据库 > Oracle > ​[20210107]编写bash shell脚本遇到的问题.txt

​[20210107]编写bash shell脚本遇到的问题.txt

原创 Oracle 作者:lfree 时间:2021-01-07 16:54:13 0 删除 编辑

[20210107]编写bash shell脚本遇到的问题.txt

--//上午写bash shell脚本,遇到一些问题,主要是自己不经常写,而且写的脚本往往是自用,里面检测并不是很严格。
--//遇到的问题做一个记录:

1.EOF问题:
--//EOF,导致脚本执行失败:
--//可以参考链接http://blog.itpub.net/267265/viewspace-2732891/
--//真心不应该使用``引用命令.在分辨率很高的情况下根本看不见,最好改用$()方式.感觉使用'EOF'更加清晰一些.
otrace=$(sqlplus -S -l / as sysdba <<'EOF'
set head off
select VALUE from v$diag_info where name='Diag Trace';
quit
EOF
)

2.没有考虑数据库是否启动的情况.应该加入判断.

wc_count=$(ps -ef | grep [o]ra_pmon_${ORACLE_SID}|wc -l)

if [ $wc_count -eq 1 ] ; then
otrace=$(sqlplus -S -l / as sysdba <<EOF
set head off
select VALUE from v\$diag_info where name='Diag Trace';
quit
EOF
)

oadump=$(sqlplus -S -l / as sysdba <<EOF
set head off
select VALUE from v\$parameter where name='audit_file_dest';
quit
EOF
)
fi

3.注意sqlplus执行后赋值的环境变量:
--//实际上这个问题以前也遇到过.通过例子说明:
oo=$(sqlplus -S -l / as sysdba <<'EOF'
set head off
select VALUE from v$diag_info where name='Diag Trace';
quit
EOF
)

$ echo $oo
/u01/app/oracle/diag/rdbms/book/book/trace

$ echo "$oo"

/u01/app/oracle/diag/rdbms/book/book/trace

--//两者的显示不一样.我感觉还是处理掉这个回车问题.我采用的方式如下:
otrace=$(echo $otrace)
oadump=$(echo $oadump)

4.test -n 判断问题:
--//我在这里栽得跟头更大.
--// -n STRING   the length of STRING is nonzero

$ [ -n $ORACLE_SID ] && echo ok
ok

--//如果bash shell变量不存在呢?
$ echo $ORACLE_SID1

$ [ -n $ORACLE_SID1 ] && echo ok
ok
--//居然也是ok,实际上应该写成如下:
$ [ -n "$ORACLE_SID1" ] && echo ok
$ echo $?
1

5.另外如果sqlplus中执行语句不长可以写成如下:
$ oo=
$ oo=$(sqlplus -S -l / as sysdba <<'EOF'^Jset head off^Jselect VALUE from v$diag_info where name='Diag Trace';^Jquit^JEOF^J)
$ echo $oo
/u01/app/oracle/diag/rdbms/book/book/trace

--//或者这样写:
$ oo=$(sqlplus -S -l / as sysdba <<< "set head off^Jselect VALUE from v\$diag_info where name='Diag Trace';^Jquit^J")
$ echo $oo
/u01/app/oracle/diag/rdbms/book/book/trace

$ oo=$(sqlplus -S -l / as sysdba <<< "set head off^Jselect VALUE from v\$diag_info where name='Diag Trace';^Jquit^J"| grep '^/')
$ echo $oo
/u01/app/oracle/diag/rdbms/book/book/trace

--// 里面^J可以通过ctrl+v+ctrl+j输入,这样代码更加简洁一些.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2748259/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    2823
  • 访问量
    6620844