Bash 为什么子字符串变量扩展可以引用没有美元符号的变量?

Bash 为什么子字符串变量扩展可以引用没有美元符号的变量?,bash,variable-expansion,Bash,Variable Expansion,在bash中,要获取变量的前4个字符,可以执行以下操作: variable='this is a variable' echo ${variable:0:4} 您可以引用如下变量,而不是硬编码长度: length=4 echo ${variable:0:$length} 但是,您似乎也可以关闭$关闭长度: echo ${variable:0:length} 您应该能够这样做对我来说没有意义,因为我一直认为要使用/计算变量,您必须在它前面加上$ 在其他语言中,我希望每个:后面的文本是一个数字

在bash中,要获取变量的前4个字符,可以执行以下操作:

variable='this is a variable'
echo ${variable:0:4}
您可以引用如下变量,而不是硬编码长度:

length=4
echo ${variable:0:$length}
但是,您似乎也可以关闭
$
关闭
长度

echo ${variable:0:length}
您应该能够这样做对我来说没有意义,因为我一直认为要使用/计算变量,您必须在它前面加上
$

在其他语言中,我希望每个
后面的文本是一个数字或一个计算结果为数字的表达式。在bash中,
length
不会计算为任何值,但
$length


这令人困惑。有人能帮我理解这里发生了什么吗?

通常使用“$”符号来展开变量是正确的,但在某些情况下,bash会自动展开变量。例如,在诸如算术或间接展开之类的上下文中 (请参阅以了解更多详细信息)。
然而,您的案例是一个简单的算术上下文扩展。

与此技巧相同:在这种情况下也不需要符号“$”:
x=(abc);echo${x[RANDOM%3]}
shell在其算术上下文中自动展开变量,字符串索引是算术上下文。相关问题:和@sergio,它描述了由
调用的间接扩展
(如
${!varname}
),这与算术上下文中的自动展开有很大不同。@Gordon,这就是答案-我认为不应该是注释。@Gordondavison谢谢!是否有一个完整的地方列表,被认为是一个算术上下文?算术上下文是shell自动扩展变量的唯一位置还是其他位置?