我将 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))
ri
arr
现在,解析为从到 的$RANDOM % N
随机数。在本例中是数组长度(元素数量),但由于数组索引从in开始,因此必须添加一个 ( ) 以便返回to 的值。0
N-1
N
${#arr[@]}
1
zsh
+ 1
$(( $RANDOM % ${#arr[@]} + 1 ))
1
N
例如打印数组的随机元素:
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) )
要打乱任意数组,一种技术是仍然使用oe
or o+
glob 限定符,例如:
shuffled_array=( /(e['reply=("$array[@]")']no+shuffle) )
即使用e
限定符通过设置来组成 glob 扩展(这里应用于/
)$reply
,然后使用 对其进行排序o+
。