2011-12-22 54 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