访问 ZSH 中的随机数组元素

访问 ZSH 中的随机数组元素

我将 ZSH 作为我的主要 shell,并且尝试随机访问数组。我一直看到feh有人打电话,但我没有这个命令。我也有_feh,不过不知道是不是同一个东西那个命令是什么。

这是参考:

FILES=( .../files/* )
feh $FILES[$RANDOM%$#FILES+1]

这是我的测试:

test=(a b c); feh ${test[$RANDOM]}

我使用的是 OSX 10.10.x 以供参考。最终我将使用它来随机化对我拥有的一些主机的 SSH 访问。

答案1

feh是一个图像查看器,只需忽略该部分...您只需要第二部分。

基本上,要访问随机数组元素,您需要类似的内容,即${arr[${ri}]},是数组的随机索引ri$(( $RANDOM % ${#arr[@]} + 1))riarr

现在,解析为从到 的$RANDOM % N随机数。在本例中是数组长度(元素数量),但由于数组索引从in开始,因此必须添加一个 ( ) 以便返回to 的值。0N-1N${#arr[@]}1zsh+ 1$(( $RANDOM % ${#arr[@]} + 1 ))1N

例如打印数组的随机元素:

print -r -- ${arr[$(( $RANDOM % ${#arr[@]} + 1 ))]}

或者简单地说,数组索引被解析为算术表达式:

print -r -- "$arr[RANDOM % $#arr + 1]"

当使用 csh 风格的语法时(当扩展不在大括号中时),引号是必要的,以便zsh解析下标;或者,可以将其写为$arr[RANDOM%$#arr+1]${arr[RANDOM % $#arr + 1]}(ksh 样式)。

答案2

另一种方法是对数组进行洗牌。在这里,对于作为全局扩展结果的数组,可以通过以下方式完成:

files=( .../files/*(noe['REPLY=$RANDOM']) )
feh $files # or $files[1]

或者

shuffle() REPLY=$RANDOME
files=( .../files/*(no+suffle) )

要打乱任意数组,一种技术是仍然使用oeor o+glob 限定符,例如:

shuffled_array=( /(e['reply=("$array[@]")']no+shuffle) )

即使用e限定符通过设置来组成 glob 扩展(这里应用于/$reply,然后使用 对其进行排序o+

相关内容