我有一個bash腳本包裝bash腳本調用KSH腳本,但掛在功能
foo.sh:
#!/bin/bash
echo "start"
. /path/to/bar/bar.ksh
echo "after bar"
getoravariables $1
bar.ksh(目的是剛剛成立的Oracle變量):
#!/bin/ksh
echo "b4 getora"
getoravariables() {
echo "1"
if [ $# -ne 1 ]
then
echo "2"
echo "Usage: getoravariables sid"
exit 1
fi
grep -w ${1} ${ORATAB_LOC} | grep -v "#" | sed "s/:/ /g" | read SID ORAHOME ASK
if [ $? -ne 0 ]
then
print "Error: Please enter a vaild SID and check the ${orafile} file for correct input"
return 1
fi
ps -ef|grep pmon|grep ${SID} >> /dev/null
if [ $? -ne 0 ]
then
print "Error: SID ${SID} does not seem to be started. "
return 2
fi
export ORACLE_SID=${SID}
export ORACLE_HOME="${ORAHOME}"
export ORAENV_ASK=NO
. $ORACLE_HOME/bin/oraenv > /dev/null
}
echo "after getora"
執行foo.sh後我得到:
>./foo.sh validsid
start
b4 getora
after getora
所以我可以說,自從「b4 getora」和「getora之後」的echo命令工作以後,只需調用ksh腳本就沒有問題。但是執行該函數有一些問題,因爲我沒有得到我期望的回聲「1」或回聲「2」。此外,如果我運行foo.sh作爲ksh腳本,一切正常。
因此,我可以假設這兩種語言之間的語法存在某種差異,但我並不感興趣。任何人都可以協助
UPDATE: 我在全KSH腳本的頂部添加set -x
,(我包含在我的問題只是一個子集)。我發現劇本中我的腳本功能我貼掛在一個點以後:
++ echo
++ grep -v '#'
++ read VAR VALUE
(hanging here)
對於這部分腳本那些代碼是:
echo $GLOBPARFIL
grep -v "#" ${GLOBPARFIL}|while read VAR VALUE
do
export ${VAR}=${VALUE}
done
所以$GLOBPARFIL
不被設置正常。它也恰好是一個變量,從getoravariables()
被拉入和設置。從調試達輸出說明了這一點:
++ read VAR VALUE
++ export GLOBPARFIL=/home/local/par/global.par
++ GLOBPARFIL=/home/local/par/global.par
這行了@jlliagre回答以下聲明的變量沒有得到正確設置。不過,我嘗試瞭解決方法只有相同的不良結果。
更新2:
按照規定我能找到真正的源頭,並創建一個解決方法的信息和邏輯:
問題:
grep -v "#" ${file_location}| tr "^" " " | while read VAR VALUE
SOLUTION:
while read VAR VALUE
do
export ${VAR}=${VALUE}
done <<%
$(grep -v "#" ${file_location}| tr "^" " ")
%
我會馬上k一樣完整。但是,如果我可以收到更多關於爲什麼這種解決方法可以解決問題的信息,我將不勝感激。
謝謝你,我的例子bar.ksh腳本實際上是我的一個更大腳本的子集。你的回答讓我質疑,如果我的真正酒吧。ksh正在一路走到最後。我在它的最後發出了回聲,它沒有回來。這個問題必須在其他地方,我將不得不更多地尋找來源。 –
@ exit_1要調試shell腳本,請在開始處加上'set -x'。它會在執行它們時顯示所有行。 – Barmar
是的,或者只是運行'bash -x foo.sh'。 – jlliagre