为什么bash间接扩展必须使用temp变量?

时间:2016-02-09 16:38:08

标签: bash parameter-expansion

https://stackoverflow.com/a/10820494/1764881开始,我知道标准的做法似乎是:

   var="SAMPLE$i"
   echo ${!var}

但是,我似乎无法做以下任何形式。他们都失败了:

echo ${!SAMPLE$i}
echo ${!"SAMPLE$i"}

我阅读了bash手册页,但我仍然无法理解。第一种形式是唯一接受的形式是真的吗?

1 个答案:

答案 0 :(得分:2)

是。基本逻辑是所有参数扩展将单个文字作为要扩展的参数的名称,并且任何其他运算符对结果执行某些操作。 !也不例外; var照常展开,但结果再次展开。

(顺便说一下,偶数数组也遵循这条规则。似乎像${array[2]%foo}这样的东西会将两个运算符应用于array,但实际上array[2]被视为单个运算符的名称参数。 little 之间存在差异,因为索引可以是任意算术表达式而不是文字数。)

(为了完整起见,我应该提到实际的例外,${!prefix*}${!name[*]},它们混淆地使用相同的运算符!来查询变量本身。第一个列出变量名称,以...开头相同的前缀;第二个列出命名数组的键。)