zsh 数组索引中的数字上下文

Numeric context in zsh array indexing

我有一个数组 schemes,由

定义
schemes=( a b c d e )

并想从中随机选择一个元素。我的第一次尝试是

echo $schemes[1 + (RANDOM % $#schemes)]

这导致我每次 运行 时都会出现 无效下标 错误(即与生成的随机数无关)。然后我将代码更改为

((n=1 + (RANDOM % $#schemes)))
echo $schemes[n]

而且效果很好。为什么?毕竟,数组索引强加了与 ((....)) 相同类型的数字上下文,不是吗?所以这两种方法应该是等价的。

根据@rowboat 友情提供的信息:

这是一个解析问题。在方括号内,只允许使用某些字符,space 不是其中之一。当解析器遇到 space 时,它不会进一步查找,而是抛出一个无效的下标错误。

这仅适用于数组访问被延迟写入 $schemes[...] 的情况。如果我将违规行写为

echo ${schemes[1 + (RANDOM % $#schemes)]}

space 不再是错误。