2011-12-22 83 views
0

我以root身份運行腳本並試圖查看用戶oracle是否定義了ORACLE_HOME。這裏是我的腳本:

su - $user << EOF 2>&1 
    if [ -n "${ORACLE_HOME:+x}" ] 
    then 
     echo "KO" > /tmp/oracle.tmp 
    else 
     echo "$ORACLE_HOME" > /tmp/oracle.tmp 
    fi 
EOF 

這是行不通的。它給了我if: Expression Syntax.並且文件沒有被創建。我認爲這個問題與su封裝有關,因爲當我單獨運行if聲明時,它正在工作。任何想法 ?

請不要問我爲什麼我以root身份運行。我知道它的壞習慣,但我無能爲力。

+0

爲什麼不乾脆:回聲$ {ORACLE_HOME:-KO}> /tmp/oracle.tmp? – 2011-12-23 05:05:29

回答

1

代碼可能不在bash中運行,但在sh中不支持替代值語法。

+0

所以你有什麼建議使它儘可能通用,因此它可以在任何shell中運行? – Michael 2011-12-22 09:14:31

+0

那麼,你可以用[-n「$ ORACLE_HOME」]替換它,它應該也可以工作(爲什麼你需要在這裏使用替代值?)或者,在bash中運行代碼。 – choroba 2011-12-22 09:25:09

+0

我只想檢查變量是否在oracle用戶下設置。問題是,我無法控制shell的用戶在運行什麼,所以當我切換到它時,我需要我的命令儘可能通用。我不知道什麼是替代值,我是一個shell腳本初學者...我會嘗試你的建議謝謝。 – Michael 2011-12-22 09:27:31

0

的問題是,報價越來越由shell解析定界符剝離,所以正在執行的代碼是:

 
if [ -n ] 

爲了消除這一問題,要避免在定界符,串插這您可以通過引用的分隔符做到:

 
su - $user << 'EOF' 2>&1 

當然,這將防止ORACLE_HOME被插入,所以這一點,如果ORACLE_HOME在環境中(也就是隻會工作,它不是一個shell變量,但已出口,是一個環境變量。LE)

除非這個問題給出的示例代碼是一個簡化的,你可以只是做:

 
echo ${ORACLE_HOME:-KO} > /tmp/oracle.tmp