HOST_NAME_="localhost:8080"
HOST_NAME_stg="stg.com:8080"
HOST_NAME_qa="qa.com:8080"
HOST_NAME=${!"HOST_NAME_$1"}
echo -n ${HOST_NAME}
我得到了错误的替换错误。但是如果传递的参数是stg,我想打印stg.com:8080。我该怎么做
答案 0 :(得分:6)
注意:鉴于您使用${!...}
间接引用变量,我假设您使用bash
- POSIX-features-only-shells和许多其他shell不支持此功能(至少使用此语法)。
尝试以下方法:
HOST_NAME_="localhost:8080"
HOST_NAME_stg="stg.com:8080"
HOST_NAME_qa="qa.com:8080"
HOST_NAME_INDIRECT=HOST_NAME_$1
HOST_NAME=${!HOST_NAME_INDIRECT}
echo -n "${HOST_NAME}"
当用${!...}
间接引用变量时,包含目标变量名的参数本身必须是变量 ,而不是字符串文字,因此中间变量$HOST_NAME_INDIRECT
。
还要考虑避免使用全大写变量名来避免与标准环境变量(例如$HOSTNAME
)和特殊shell变量(例如$SECONDS
)的潜在冲突。
以下各种受欢迎的shell 如何做变量间接:
假设以下两个变量:
a='value of a'
nameOfA='a'
bash
echo "${!nameOfA}" # -> 'value of a'
# bash 4.3+
declare -n aliasOfA='a' # in functions: `local -n`
echo "$aliasOfA" # same as `echo "$a"` -> 'value of a'
zsh
echo "${(P)nameOfA}" # -> 'value of a'
ksh
93 +:
nameref aliasOfA='a' # same as `typeset -n`
echo "$aliasOfA" # same as `echo "$a"` -> 'value of a'
sh
(POSIX-features-only-shells)
eval echo \"'$'$nameOfA\" # -> 'value of a'
警告:使用eval
可能不安全。如果$nameOfA
包含'a; $(rm *)'
之类的内容,则rm
命令也会执行。
答案 1 :(得分:0)
感谢您的回复。是的,使用临时变量确实可以解决问题。但我想出是否这样做是为了达到目的但是有点复杂
eval "HOST_NAME=\$HOST_NAME_$2"