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 访问。
feh
是一个图像查看器,忽略那部分...你只想要第二部分。
基本上,访问你想要的东西像一个随机数组元素${arr[${ri}]}
,其中ri
被$(( $RANDOM % ${#arr[@]} + 1))
也就是说,ri
是数组的随机指数arr
现在,$RANDOM % N
解析为从0
to的随机数N-1
。在这种情况下N
是数组长度${#arr[@]}
(元素数),但由于数组索引从1
in开始,zsh
您必须添加一个 ( + 1
) 以便$(( $RANDOM % ${#arr[@]} + 1 ))
返回值 from 1
to 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 风格)。