检查shell脚本中的$ ORACLE_HOME var

时间:2011-12-22 09:10:55

标签: bash shell

我以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身份运行。我知道它的不良做法,但我无能为力。

2 个答案:

答案 0 :(得分:1)

代码可能不是在bash中运行,而是在sh中不支持备用值语法。

答案 1 :(得分:0)

问题是解析heredoc的shell会剥离引号,因此正在执行的代码是:

if [ -n ]

要消除这个问题,你想避免在heredoc中进行字符串插值,你可以通过引用分隔符来做:

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

当然,这会阻止ORACLE_HOME被插值,所以这只有在ORACLE_HOME在环境中时才有效(也就是说,它不是shell变量,但是已经导出并且是环境变量。)

除非问题中给出的示例代码是简化,否则您可以这样做:

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