来自变量的bash变量值

时间:2018-01-05 18:03:26

标签: bash variables

我在文件中有这些变量

PRODUCT="ABC"

ABC_SERVER_1="server-a.com"
ABC_PORT_1="4045"
ABC_SERVER_2="server-b.com"
ABC_PORT_2="2021"
ABC_SERVER="$ABC_SERVER_1"
ABC_PORT="$ABC_PORT_1"

XYZ_SERVER_1="server-c.com"
XYZ_PORT_1="4046"
XYZ_SERVER_2="server-d.com"
XYZ_PORT_2="2022"
XYZ_SERVER="$XYZ_SERVER_2"
XYZ_PORT="$XYZ_PORT_2"

我需要bash命令行给我PRODUCT_SERVER和PRODUCT_PORT

例如,如果PRODUCT =“ABC”,$ PRODUCT_SERVER会给我server-a.com,如果PRODUCT =“XYZ”,$ PRODUCT_SERVER会给我server-d.com和端口......

4 个答案:

答案 0 :(得分:0)

最好重新设计如何处理变量。此外,大写字母通常用于环境变量,而不是脚本中的变量。

话虽如此,这是一个丑陋的黑客:

name=${PRODUCT}_SERVER
set | sed  -n "s/^$name=//p"

答案 1 :(得分:0)

通过

解决
  eval 'PRODUCT_SERVER=${PRODUCT}_SERVER'
  eval 'PRODUCT_PORT=${PRODUCT}_PORT'
  eval 'PRODUCT_SERVER_1=${PRODUCT}_SERVER_1'
  eval 'PRODUCT_PORT_1=${PRODUCT}_PORT_1'
  eval 'PRODUCT_SERVER_2=${PRODUCT}_SERVER_2'
  eval 'PRODUCT_PORT_2=${PRODUCT}_PORT_2'

  echo ${!PRODUCT_SERVER}
  echo ${!PRODUCT_PORT}

答案 2 :(得分:0)

使用bash,您可以使用indirect variable

server_var="${PRODUCT}_SERVER"
port_var="${PRODUCT}_PORT"
echo "${!server_var}:${!port_var}"
server-a.com:4045

或者使用最新版本name reference

declare -n server="${PRODUCT}_SERVER" port="${PRODUCT}_PORT"
echo "$server:$port"
server-a.com:4045

但是,最好使用关联数组:

declare -A server_1=(
    [ABC]="server-a.com"
    [XYZ]="server-c.com"
)
declare -A port_1=(
    [ABC]="4045"
    [XYZ]="4046"
)
declare -A server_2=(
    [ABC]="server-b.com"
    [XYZ]="server-d.com"
)
declare -A port_2=(
    [ABC]="2021"
    [XYZ]="2022"
)
declare -A server=(
    [ABC]="${server_1[ABC]}"
    [XYZ]="${server_2[XYZ]}"
)
declare -A port=(
    [ABC]="${port_1[ABC]}"
    [XYZ]="${port_2[XYZ]}"
)

product="ABC"
echo "${server[$product]}:${port[$product]}"

答案 3 :(得分:0)

你可以使用一个关联数组(老实说,我在@glennjackman发布他之前正在研究这个!):

declare -A table

table[ABC_SERVER_1]="server-a.com"
table[ABC_PORT_1]="4045"
table[ABC_SERVER_2]="server-b.com"
table[ABC_PORT_2]="2021"
table[ABC_SERVER]=${table[ABC_SERVER_1]}
table[ABC_PORT]="${table[ABC_PORT_1]}"

table[XYZ_SERVER_1]="server-c.com"
table[XYZ_PORT_1]="4046"
table[XYZ_SERVER_2]="server-d.com"
table[XYZ_PORT_2]="2022"
table[XYZ_SERVER]="${table[XYZ_SERVER_2]}"
table[XYZ_PORT]="${table[XYZ_PORT_2]}"

product="ABC"
echo "${table[${product}_SERVER]}"

product="XYZ"
echo "${table[${product}_SERVER]}"

给出:

server-a.com
server-d.com

请注意,键可以是您喜欢的任何情况,而不必担心与shell变量名冲突。