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.我该怎么做
注意:鉴于您使用${!...}间接引用变量,我假设您正在使用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)
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'
Run Code Online (Sandbox Code Playgroud)zsh
echo "${(P)nameOfA}" # -> 'value of a'
Run Code Online (Sandbox Code Playgroud)ksh 93+:
nameref aliasOfA='a' # same as `typeset -n`
echo "$aliasOfA" # same as `echo "$a"` -> 'value of a'
Run Code Online (Sandbox Code Playgroud)sh (POSIX-features-only shell)
eval echo \"'$'$nameOfA\" # -> 'value of a'
Run Code Online (Sandbox Code Playgroud)警告:使用eval可能不安全.如果$nameOfA包含类似的内容'a; $(rm *)',rm命令也会执行.