2010-03-05 6 views
24

Je crée un bot dans Script Shell:Sélectionnez un élément aléatoire d'un tableau

# Array with expressions 
expressions=("Ploink Poink" "I Need Oil" "Some Bytes are Missing!" "Poink Poink" "Piiiip Beeeep!!" "Hello" "Whoops! I'm out of memmory!") 

# Seed random generator 
RANDOM=$$$(date +%s) 

# Loop loop loop loop loop loop ... 
while [ 1 ] 
do 
    # Get random expression... 
    selectedexpression=${expressions[$RANDOM % ${#RANDOM[*]}]} 

    # Write to Shell 
    echo $selectedexpression 


    # Wait an half hour 
    sleep 1 # It's one second for debugging, dear SOers 
done 

Je veux qu'il imprime un élément aléatoire de la expressions chaque seconde. J'ai essayé mais ça ne marche pas. Il imprime seulement le premier (Ploink Poink) à chaque fois. Quelqu'un peut m'aider? Merci

Répondre

54

Changer la ligne où vous définissez selectedexpression à

selectedexpression=${expressions[$RANDOM % ${#expressions[@]} ]}

Vous voulez que votre index dans l'expression soit un nombre aléatoire de 0 à la longueur du tableau d'expression. Cela fera cela.

+6

Notez que ce code sera toujours biaisé vers les indices de tableau inférieurs . – Joey

+10

True. Cependant, à moins que votre liste d'expressions ne soit très longue, l'effet est mineur. $ RANDOM est un nombre entre 0 et 32767. Supposons que vous ayez 100 éléments dans votre liste. Les 67 premiers éléments auraient une chance de 328/32767 (.01001), alors que les 33 derniers auraient une chance de 327/32767 (.00998). Pour une liste plus courte, la différence serait encore moindre. Pourtant, vous faites un bon point, et la fonction shell RANDOM n'est pas adaptée aux situations où vous devez avoir des nombres vraiment aléatoires, tels que la cryptographie. –

3

Voici une autre solution qui peut être un peu plus aléatoire que Jacob solution Mattison (difficile à dire des jot manpages):

declare -a expressions=('Ploink' 'I Need Oil' 'Some Bytes are Missing' 'Poink Poink' 'Piiiip Beeeep' 'Hello' 'Whoops I am out of memory') 
index=$(jot -r 1 0 $((${#expressions[@]} - 1))) 
selected_expression=${expressions[index]} 
+1

A travaillé très bien pour une courte liste choisie au hasard. Je vous remercie! – Terrance

4
arr[0]="Ploink Poink" 
arr[1]="I Need Oil" 
arr[2]="Some Bytes are Missing!" 
arr[3]="Poink Poink" 
arr[4]="Piiiip Beeeep!!" 
arr[5]="Hello" 
arr[6]="Whoops! I'm out of memmory!" 
rand=$[$RANDOM % ${#arr[@]}] 
echo $(date) 
echo ${arr[$rand]} 
+0

cela donne - 'lun mars 13 10:04:55 IST 2017 Oups! Je suis en dehors de memmory! ' –

+0

Des éléments supplémentaires peuvent être ajoutés au tableau, par ex. 'arr [7] =" Zip, ding, une autre ligne. "' – noobninja

Questions connexes