Come posso ottenere casualità nella riga di comando?


11

Come eseguire casualmente un comando all'interno dell'elenco di comandi specificato? Utile per la scelta casuale del suono di avvio, dello sfondo o dell'esecuzione dei comandi.

In generale, se ho i comandi per l'esecuzione come segue, come posso ottenere casualità :?

#!/bin/bash
<command_1>
<command_2>
<command_3>
.
.
.
<command_n>

Quindi voglio eseguire casualmente solo un comando dalle possibilità sopra quando viene eseguito lo script!

Come farlo?



@Parto Ho già aggiunto come risposta prima
Pandya

Non stavo cercando di rispondere, stavo solo dando un esempio in cui può essere utilizzato.
Parto,

Risposte:


21

La variabile $RANDOM(in realtà una funzione bash) restituisce un numero casuale compreso tra 0 e 32767 incluso.

In genere si desidera limitare il suo intervallo dividendolo per un numero e prendere il resto, ad es.

# output a random number 0 to 3
echo $((RANDOM % 4))

In questo esempio semplicistico sarà leggermente distorto per qualsiasi divisore che non si divida equamente in 32768 (ad esempio, qualsiasi cosa che non sia una potenza di due), ma nel tuo scenario non penso che ti vergognino da un leggero pregiudizio.

Per scegliere un file casuale, dovresti nominare i tuoi file come:

file0.jpg
file1.jpg
file2.jpg
file3.jpg

E poi puoi sceglierne uno a caso con

# output a random file from file0.jpg to file3.jpg
echo "file$((RANDOM % 4)).jpg"

1
Potresti voler pubblicarlo come una tua risposta - potrebbe guadagnare la tua reputazione.
thomasrutter,

uso utile di RANDOM, ho accettato!
Pandya,

1
Si noti che RANDOM% N non si traduce in una distribuzione uguale a meno che il numero di valori possibili di RANDOM (32768) non sia divisibile per N. N è 2: ci sono tre modi in cui $ RANDOM% 2 produce 0 (se $ RANDOM restituisce 0, 2, 4) ma due modi per ottenere 1 (1, 3). Per una distribuzione uguale dovresti trovare il massimo multiplo di N che è più piccolo di 32767 e ignorare qualsiasi valore casuale più grande di quello. Nell'esempio precedente ciò equivarrebbe a ignorare 5, che è maggiore di 4.
Doval

@Doval Ho detto che nella mia risposta, l'hai visto?
thomasrutter,

@neon_overload Mio male, mi sono perso un po '.
Doval,

7

In base alla risposta @neon_overload (utilizzo RANDOM),
posso inserire RANDOMcome esempio lo script (per 4 comandi):

#!/bin/bash
random_selection=$((RANDOM % 4))

case $random_selection in

  0)
  <command_1>
  ;;

  1)
  <command_2>
  ;;

  2)
  <command_3>
  ;;

  3)
  <command_4>
  ;;

esac

2

Se desideri casualità attraverso un sito esterno anziché uno generato dal tuo computer, puoi utilizzare questo script:

curl "http://www.random.org/integers/?num=1&min=$1&max=$2&col=1&base=10&format=plain&rnd=new"

Esegui come rand (MIN) (MAX) (supponendo che tu salvi come / usr / bin / rand)

Potrebbe essere necessario installare prima curl (sudo apt-get install curl) se non è già installato.


0

Puoi usare il shufcomando dai coreutils GNU .

NAME
       shuf - generate random permutations

SYNOPSIS
       shuf [OPTION]... [FILE]
       shuf -e [OPTION]... [ARG]...
       shuf -i LO-HI [OPTION]...

DESCRIPTION
       Write a random permutation of the input lines to standard output

Esempio:

$ shuf -i 1-5
4
1
2
5
3

$ shuf -e Debian Ubuntu Trisquel 
Trisquel
Debian
Ubuntu

Ora, per ottenere una voce casuale puoi usare -n 1quali output prima riga.

Esempio per la stampa di numeri casuali da 1 a 100:

$ shuf -i 1-100 -n 1
37

Se hai filecon i seguenti contenuti:

$ cat file
command-1
command-2
command-3
command-4
command-5

Puoi anche fare qualcosa del tipo:

$ shuf file -n 1
command-3
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.