Wie erhalte ich Zufälligkeit in der Befehlszeile?

11

Wie kann ein Befehl innerhalb der angegebenen Befehlsliste zufällig ausgeführt werden? Hilfreich für die zufällige Auswahl von Startsound, Hintergrundbild oder Ausführung von Befehlen.

Im Allgemeinen, wenn ich Befehle zur Ausführung wie folgt habe, wie erhalte ich Zufälligkeit:?

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

Dann möchte ich zufällig nur einen Befehl aus den oben genannten Möglichkeiten ausführen, wenn das Skript ausgeführt wird!

Wie geht das?

Pandya
quelle
Praktisches Beispiel: askubuntu.com/a/257471/163331
Parto
@ Parto Ich habe bereits als Antwort zuvor hinzugefügt
Pandya
Ich habe nicht versucht zu antworten, sondern nur ein Beispiel gegeben, wo es verwendet werden kann.
Parto

Antworten:

21

Die Variable $RANDOM(eigentlich eine Bash-Funktion) gibt eine Zufallszahl von 0 bis einschließlich 32767 zurück.

Normalerweise möchten Sie die Reichweite begrenzen, indem Sie sie durch eine Zahl teilen und den Rest nehmen, z.

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

In diesem simplen Beispiel ist es für jeden Divisor, der sich nicht gleichmäßig in 32768 teilt (z. B. alles, was keine Zweierpotenz ist), sehr voreingenommen, aber in Ihrem Szenario denke ich nicht, dass Sie sich Sorgen machen würden durch eine leichte Voreingenommenheit.

Um eine zufällige Datei auszuwählen, benennen Sie Ihre Dateien wie folgt:

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

Und dann können Sie eine zufällige mit auswählen

# output a random file from file0.jpg to file3.jpg
echo "file$((RANDOM % 4)).jpg"
thomasrutter
quelle
1
Vielleicht möchten Sie es als Ihre eigene Antwort veröffentlichen - es könnte Ihnen dann einen guten Ruf einbringen.
Thomasrutter
hilfreiche Verwendung von RANDOM, ich akzeptierte!
Pandya
1
Beachten Sie, dass RANDOM% N nur dann zu einer gleichen Verteilung führt, wenn die Anzahl der möglichen Werte von RANDOM (32768) durch N teilbar ist. Stellen Sie sich vor, der Bereich von RANDOM wäre stattdessen 0-4 (5 mögliche Werte) und N ist 2: Es gibt drei Möglichkeiten, wie $ RANDOM% 2 0 ergibt (wenn $ RANDOM 0, 2, 4 ergibt), aber zwei Möglichkeiten, um 1 (1, 3) zu ergeben. Für eine gleichmäßige Verteilung müssten Sie das größte Vielfache von N finden, das kleiner als 32767 ist, und alle zufälligen Werte ignorieren, die größer als das sind. Im vorherigen Beispiel würde das bedeuten, 5 zu ignorieren, was größer als 4 ist.
Doval
@Doval Ich sagte, dass in meiner Antwort, haben Sie es gesehen?
Thomasrutter
@neon_overload Mein schlechtes, ich habe das bisschen verpasst.
Doval
7

Laut @neon_overload answer (using RANDOM)
kann ich RANDOMein Beispielskript wie folgt einfügen (für 4 Befehle):

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

case $random_selection in

  0)
  <command_1>
  ;;

  1)
  <command_2>
  ;;

  2)
  <command_3>
  ;;

  3)
  <command_4>
  ;;

esac
Pandya
quelle
2

Wenn Sie Zufälligkeit über eine externe Site und nicht über eine von Ihrem Computer generierte Site wünschen, können Sie dieses Skript verwenden:

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

Als Rand (MIN) (MAX) ausführen (vorausgesetzt, Sie speichern als / usr / bin / rand)

Möglicherweise müssen Sie zuerst curl installieren (sudo apt-get install curl), wenn es nicht bereits installiert ist.

iggyvolz
quelle
0

Sie können shufBefehle von GNU coreutils verwenden .

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

Beispiel:

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

$ shuf -e Debian Ubuntu Trisquel 
Trisquel
Debian
Ubuntu

Um einen zufälligen Eintrag zu erhalten, können Sie jetzt -n 1die erste Zeile der Ausgabe verwenden.

Beispiel zum Drucken einer Zufallszahl von 1-100:

$ shuf -i 1-100 -n 1
37

Wenn Sie filemit folgenden Inhalten haben:

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

Sie können auch Folgendes tun:

$ shuf file -n 1
command-3
Pandya
quelle