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

Abh*_*she 1 unix shell 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}
Run Code Online (Sandbox Code Playgroud)

我得到错误替换错误.但是如果传递的参数是stg,我想打印stg.com:8080.我该怎么做

mkl*_*nt0 6

注意:鉴于您使用${!...}间接引用变量,我假设您正在使用bash - POSIX-features-only 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}"
Run Code Online (Sandbox Code Playgroud)

当间接引用变量时${!...},包含目标变量名参数本身必须是变量,而不是字符串文字,因此是中间变量$HOST_NAME_INDIRECT.

还要考虑避免使用全大写变量名来避免与标准环境变量(例如$HOSTNAME)和特殊shell变量(例如$SECONDS)的潜在冲突.


以下是各种流行的shell如何进行变量间接:

假设以下两个变量:

a='value of a'
nameOfA='a'
Run Code Online (Sandbox Code Playgroud)

警告:使用eval可能不安全.如果$nameOfA包含类似的内容'a; $(rm *)',rm命令也会执行.