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 不再是错误。
我有一个数组 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 不再是错误。