我以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 :(得分: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