在动态unix中为变量赋值 - 变量间接

时间:2014-04-19 14:40:31

标签: shell unix indirection

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

2 个答案:

答案 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"