​[20210107]編寫bash shell指令碼遇到的問題.txt

lfree發表於2021-01-07

[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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章