外壳变量的双重扩展

问题描述

我有一个表,其中包含一个env变量,我需要获取该变量的值并从shell脚本中导出另一个Java实用程序:

    command="SELECT param_value FROM tableX WHERE param_name='ABCD';"
    #This param_value is ${PATHX} and PATHX is /home/users/pathx

    ParaM_VALUE=`sqlplus -s $CONN_STRING <<- END
    SET head off;
    set Feedback off;
    ${command}
    exit;
    END`

    echo ${ParaM_VALUE} | grep -q "ERROR"
    if [ $? -eq 0 ]
    then
            echo "Failed in fetching param_value "
            exit 1
    else
            #Trimming the value fetched from DB
            ParaM_VALUE=`echo "${ParaM_VALUE}" | tr -d " " | tr -d "\n"`
            echo "Value fetched from DB=${ParaM_VALUE}" 
            #This prints ${PATHX}
            export PATH_VALUE="${ParaM_VALUE}" 
            #This is exporting PATH_VALUE as ${PATHX} instead of /home/users/pathx - WHICH IS WHERE I NEED HELP
            #If I put directly export PATH_VALUE="${PATHX}",it exports the value correctly as /home/users/pathx
    fi

搜索选项后,我尝试了如下所示的各种选项,但失败了:

export PATH_VALUE="${ParaM_VALUE}"
export PATH_VALUE=`eval echo "\$${ParaM_VALUE}"`
export PATH_VALUE=$(eval \$$ParaM_VALUE)
export PATH_VALUE=${$ParaM_VALUE}
export PATH_VALUE=${!ParaM_VALUE}
export PATH_VALUE=`echo ${ParaM_VALUE}`
export PATH_VALUE=`expr ${ParaM_VALUE}`

请建议在这种情况下可以导出实际的扩展值-/ home / users / pathx。

解决方法

要使其按预期方式工作,sqlplus查询响应应为PATHX而不是${PATHX}。解决它的一种方法是替换

PARAM_VALUE=`echo "${PARAM_VALUE}" | tr -d " " | tr -d "\n"`

使用

PARAM_VALUE=`echo "${PARAM_VALUE}" | tr -dc '[:alnum:]\n\r'`
,

是,查询响应为$ {PATHX},这是我需要扩展的环境变量。

您可以使用eval,但是eval是邪恶的,如果导出了值,请执行安全的envsubst

PARAM_VALUE=$(envsubst <<<"$PARAM_VALUE") 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...