1
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。我该怎么做

4

2 回答 2

6

注意:鉴于您使用${!...}间接引用变量,我假设您正在使用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'
    
  • ksh93+:

     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命令也会执行。

于 2014-04-19T15:20:07.217 回答
0

感谢您的回复。是的,使用临时变量确实可以解决问题。但是我想知道这样做是否可以达到目的,但它有点复杂

eval "HOST_NAME=\$HOST_NAME_$2"
于 2014-04-19T15:53:27.457 回答