Jak uzyskać losowość w wierszu polecenia?

11

Jak losowo wykonać jedno polecenie na określonej liście poleceń? Pomocne przy losowym wybieraniu dźwięku startowego, tapety lub wykonywaniu poleceń.

Ogólnie, jeśli mam polecenia do wykonania w następujący sposób, to jak mogę uzyskać losowość :?

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

Następnie chcę wykonać losowo tylko jedno polecenie z powyższych możliwości, gdy skrypt jest uruchomiony!

Jak to zrobić?

Pandya
źródło
Praktyczny przykład: askubuntu.com/a/257471/163331
Parto
@Parto ja już dodane jako odpowiedź przed
Pandya
Nie próbowałem odpowiedzieć, podałem tylko przykład, gdzie można go użyć.
Parto

Odpowiedzi:

21

Zmienna $RANDOM(właściwie funkcja bash) zwraca liczbę losową od 0 do 32767 włącznie.

Zazwyczaj chciałbyś ograniczyć jego zasięg, dzieląc go przez pewną liczbę i biorąc resztę, np.

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

W tym uproszczonym przykładzie będzie to bardzo nieznacznie tendencyjne dla każdego dzielnika, który nie dzieli się równo na 32768 (np. Cokolwiek, co nie jest potęgą dwóch), ale w twoim scenariuszu nie sądzę, abyś był zmartwiony z lekkim uprzedzeniem.

Aby wybrać losowy plik, nadaj swoim plikom nazwę:

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

A następnie możesz wybrać losowy za pomocą

# output a random file from file0.jpg to file3.jpg
echo "file$((RANDOM % 4)).jpg"
thomasrutter
źródło
1
Możesz opublikować go jako własną odpowiedź - może wtedy zyskać reputację.
thomasrutter
pomocne wykorzystanie RANDOM, zaakceptowałem!
Pandya
1
Zauważ, że RANDOM% N nie powoduje równego rozkładu, chyba że liczba możliwych wartości RANDOM (32768) jest podzielna przez N. Aby to zobaczyć, wyobraź sobie, że zakres RANDOM wynosił 0-4 (5 możliwych wartości), i N wynosi 2: istnieją trzy sposoby, aby $ RANDOM% 2 dał 0 (jeśli $ RANDOM daje 0, 2, 4), ale dwa sposoby, aby uzyskać 1 (1, 3). Aby uzyskać równy rozkład, musisz znaleźć największą wielokrotność N, która jest mniejsza niż 32767 i zignorować wszelkie losowe wartości, które są większe. W poprzednim przykładzie oznaczałoby to zignorowanie wartości 5, która jest większa niż 4.
Doval
@Doval Powiedziałem, że w mojej odpowiedzi widziałeś to?
thomasrutter
@neon_overload My bad, przegapiłem ten kawałek.
Doval
7

Zgodnie z odpowiedzią @neon_overload (używanie RANDOM),
mogę umieścić RANDOMprzykładowy skrypt w następujący sposób (dla 4 poleceń):

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

case $random_selection in

  0)
  <command_1>
  ;;

  1)
  <command_2>
  ;;

  2)
  <command_3>
  ;;

  3)
  <command_4>
  ;;

esac
Pandya
źródło
2

Jeśli chcesz losowości za pośrednictwem strony zewnętrznej, a nie tej generowanej przez komputer, możesz użyć tego skryptu:

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

Uruchom jako rand (MIN) (MAX) (zakładając, że zapisujesz jako / usr / bin / rand)

Być może będziesz musiał najpierw zainstalować curl (sudo apt-get install curl), jeśli nie jest jeszcze zainstalowany.

iggyvolz
źródło
0

Możesz użyć shufpolecenia z jądra 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

Przykład:

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

$ shuf -e Debian Ubuntu Trisquel 
Trisquel
Debian
Ubuntu

Teraz, aby uzyskać jeden losowy wpis, możesz użyć, -n 1które wyjścia pierwszego wiersza.

Przykład drukowania losowej liczby od 1-100:

$ shuf -i 1-100 -n 1
37

Jeśli masz filenastępujące treści:

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

Możesz także zrobić coś takiego:

$ shuf file -n 1
command-3
Pandya
źródło