为什么 bash 间接扩展必须使用临时变量?
Why bash indirect expansion has to use temp variable?
从,我知道标准的做法似乎是:
var="SAMPLE$i"
echo ${!var}
但是,我似乎无法完成以下任何表格。他们都失败了:
echo ${!SAMPLE$i}
echo ${!"SAMPLE$i"}
我阅读了 bash 手册页,但仍然无法理解。第一种形式是唯一被接受的形式吗?
是的。基本逻辑是 all 参数扩展采用单个文字词作为要扩展的参数的名称,并且任何其他运算符都会对结果执行某些操作。 !
也不例外; var
照常展开,但 结果 再次展开。
(顺便说一句,即使数组也遵循此规则。看起来 ${array[2]%foo}
将两个运算符应用于 array
,但实际上 array[2]
被视为一个参数。有一个 小 区别,因为索引允许是任意算术表达式而不是文字数字。)
(为了完整起见,我应该提到实际的异常,${!prefix*}
和 ${!name[*]}
,它们混淆地使用相同的运算符 !
来查询变量本身。第一个列出变量名称以相同的前缀开头;第二个列出命名数组的键。)
从,我知道标准的做法似乎是:
var="SAMPLE$i"
echo ${!var}
但是,我似乎无法完成以下任何表格。他们都失败了:
echo ${!SAMPLE$i}
echo ${!"SAMPLE$i"}
我阅读了 bash 手册页,但仍然无法理解。第一种形式是唯一被接受的形式吗?
是的。基本逻辑是 all 参数扩展采用单个文字词作为要扩展的参数的名称,并且任何其他运算符都会对结果执行某些操作。 !
也不例外; var
照常展开,但 结果 再次展开。
(顺便说一句,即使数组也遵循此规则。看起来 ${array[2]%foo}
将两个运算符应用于 array
,但实际上 array[2]
被视为一个参数。有一个 小 区别,因为索引允许是任意算术表达式而不是文字数字。)
(为了完整起见,我应该提到实际的异常,${!prefix*}
和 ${!name[*]}
,它们混淆地使用相同的运算符 !
来查询变量本身。第一个列出变量名称以相同的前缀开头;第二个列出命名数组的键。)