Acessando o elemento da matriz aleatória no ZSH

2

Eu tenho o ZSH como meu shell principal e estou tentando randomizar o acesso a um array. Eu continuo vendo feh chamado, mas eu não tenho esse comando. Eu tenho _feh , mas não sei se é a mesma coisa. Qual é esse comando?

Aqui está a referência:

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

Aqui está o meu teste:

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

Estou no OSX 10.10.x para referência. Por fim, usarei isso para randomizar o acesso SSH a alguns hosts que eu tenho.

    
por mxplusb 03.06.2016 / 00:10

1 resposta

5

feh é um visualizador de imagens, apenas ignore essa parte ... você quer apenas a segunda parte.

Basicamente, para acessar um elemento de matriz aleatório, você deseja algo como ${arr[${ri}]} , em que ri é $(( $RANDOM % ${#arr[@]} + 1)) , ou seja, ri é um índice aleatório da matriz arr

Agora, $RANDOM % N resolve um número aleatório de 0 a N-1 . Nesse caso, N é o comprimento da matriz ${#arr[@]} (número de elementos), mas como a indexação da matriz começa em 1 em zsh , é necessário adicionar uma ( + 1 ) para que $(( $RANDOM % ${#arr[@]} + 1 )) retorne um valor de 1 to N .

Então, por exemplo para imprimir um elemento aleatório da matriz:

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

Ou simplesmente, como índices de array são analisados como expressões aritméticas:

print -r -- $arr[RANDOM % $#arr + 1]
    
por 03.06.2016 / 01:26