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。我该怎么做
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。我该怎么做
注意:鉴于您使用${!...}
间接引用变量,我假设您正在使用bash
- POSIX-features-only shells 和许多其他不支持此功能(至少使用此语法)。
尝试以下操作:
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 功能的外壳)
eval echo \"'$'$nameOfA\" # -> 'value of a'
警告:使用eval
可能不安全。如果$nameOfA
包含类似的内容'a; $(rm *)'
,该rm
命令也会执行。
感谢您的回复。是的,使用临时变量确实可以解决问题。但是我想知道这样做是否可以达到目的,但它有点复杂
eval "HOST_NAME=\$HOST_NAME_$2"