bash中的双花括号 - 糟糕的替换

时间:2014-12-29 03:31:02

标签: bash

这有效:

echo ${!var_pointing_to_another_var}

这不是:

echo ${!${var}_string_suffix}

换句话说,我有一个由两部分组成的var:第一个是另一个变量,第二个是字符串后缀。它们一起形成一个指向另一个var的var。但是我得到了一个糟糕的替换错误。

由于可读性和安全性问题,我想避免使用eval命令。

2 个答案:

答案 0 :(得分:5)

据我所知,这是唯一的方法。

t="${var}_string_suffix"
echo "${!t}"

答案 1 :(得分:2)

http://mywiki.wooledge.org/BashFAQ/006

您可能想要的是associative array

# The most common multi-dimensional array emulation for bash >= 4.0 is
# to use an associative array with delimiter.
typeset -A arr=([foo;bar]=test)
printf '%s\n' "${arr[$(printf '%q;%q' "$var1" "$var2")]}" # bash 4

使用${!var}的间接不太便于携带,不一定比eval更安全。基于eval的间接是很好理解的,而bash间接扩展可能会引入模糊的错误,而不会对其机制和仔细的输入验证有充分的理解。上面的wiki页面提供了很好的介绍。 “namerefs”是bash 4.3的另一种解决方法,但它们通常不应该以这种方式使用。

var1=foo
var2=bar
foobar=test
ref=${var1}${var2}
printf '%s\n' "${!ref}" # print test (bash-only, <= 4.3)

# Note: not a great example of nameref usage
typeset -n ref2=${var1}${var2}
printf '%s\n' "$ref2" # bash >= 4.3 / ksh93 / mksh

# Correct eval usage
if [[ $ref == [a-zA-Z_]+([a-zA-Z0-9_]) ]]; then
    eval printf '%s\\n' "\${$ref}" # POSIX
    eval printf '%s\\n' "$(printf '${%q}' "$ref")" # bash / ksh93 / zsh
fi
相关问题