访问 ZSH 中的随机数组元素

mxp*_*usb 5 shell zsh shell-script

我有 ZSH 作为我的主要 shell,我正在尝试随机访问一个数组。我一直看到feh被叫,但我没有那个命令。我有_feh,但不知道是不是一样的 那是什么命令。

这是参考:

FILES=( .../files/* )
feh $FILES[$RANDOM%$#FILES+1]
Run Code Online (Sandbox Code Playgroud)

这是我的测试:

test=(a b c); feh ${test[$RANDOM]}
Run Code Online (Sandbox Code Playgroud)

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

don*_*sti 7

feh 是一个图像查看器,忽略那部分...你只想要第二部分。

基本上,访问你想要的东西像一个随机数组元素${arr[${ri}]},其中ri$(( $RANDOM % ${#arr[@]} + 1))也就是说,ri是数组的随机指数arr

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

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

print -r -- ${arr[$(( $RANDOM % ${#arr[@]} + 1 ))]}
Run Code Online (Sandbox Code Playgroud)

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

print -r -- "$arr[RANDOM % $#arr + 1]"
Run Code Online (Sandbox Code Playgroud)

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