从https://stackoverflow.com/a/10820494/1764881,我知道标准的做法似乎是:
var="SAMPLE$i"
echo ${!var}
但是,我似乎无法做以下任何一种形式。他们都失败了:
echo ${!SAMPLE$i}
echo ${!"SAMPLE$i"}
我阅读了 bash 手册页,但我仍然无法理解。第一种形式是唯一被接受的形式,对吗?
从https://stackoverflow.com/a/10820494/1764881,我知道标准的做法似乎是:
var="SAMPLE$i"
echo ${!var}
但是,我似乎无法做以下任何一种形式。他们都失败了:
echo ${!SAMPLE$i}
echo ${!"SAMPLE$i"}
我阅读了 bash 手册页,但我仍然无法理解。第一种形式是唯一被接受的形式,对吗?
是的。基本逻辑是所有参数扩展都将单个字面量词作为要扩展的参数的名称,并且任何附加的运算符都会对结果做一些事情。!
也不例外;var
像往常一样扩展,但结果再次扩展。
(顺便说一句,即使数组也遵循此规则。看起来像${array[2]%foo}
将两个运算符应用于array
,但实际上array[2]
被视为单个参数的名称。有一点区别,因为索引允许是任意算术表达式而不是文字数字。)
(为了完整起见,我应该提到实际的异常,${!prefix*}
and ${!name[*]}
,它们混淆地使用相同的运算符!
来查询变量本身。第一个列出了以相同前缀开头的变量名;第二个列出了命名数组的键。)