我在文件中有这些变量
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和端口......
答案 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变量名冲突。