it-swarm.com.de

So führen Sie einen Befehl 1 von N Mal in Bash aus

Ich möchte einen Weg finden, einen Befehl zufällig auszuführen, sagen wir 1 von 10 Mal. Gibt es ein eingebautes oder GNU Coreutil, um dies zu tun, idealerweise so etwas wie:

chance 10 && do_stuff

wo do_stuff wird nur 1 von 10 mal ausgeführt? Ich weiß, dass ich ein Skript schreiben könnte, aber es scheint eine ziemlich einfache Sache zu sein, und ich habe mich gefragt, ob es einen definierten Weg gibt.

15
retnikt

In ksh, Bash, Zsh, Yash oder BusyBox sh:

[ "$RANDOM" -lt 3277 ] && do_stuff

Die spezielle Variable RANDOM der Korn-, Bash-, Yash-, Z- und BusyBox-Shells erzeugt jedes Mal, wenn sie ausgewertet wird, einen pseudozufälligen dezimalen ganzzahligen Wert zwischen 0 und 32767 -ten Chance.

Sie können dies verwenden, um eine Funktion zu erstellen, die sich wie in Ihrer Frage beschrieben verhält, zumindest in Bash:

function chance {
  [[ -z $1 || $1 -le 0 ]] && return 1
  [[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}

Wenn Sie vergessen, ein Argument oder ein ungültiges Argument anzugeben, erhalten Sie ein Ergebnis von 1, sodass chance && do_stuff Niemals do_stuff Wird.

Dies verwendet die allgemeine Formel für "1 in n" unter Verwendung von $RANDOM, Die [[ $RANDOM -lt $((32767 / n + 1)) ]] ist und ein (⎣32767/n ergibt ⎦ + 1) bei 32768 Chance. Werte von n, die keine Faktoren von 32768 sind, führen aufgrund der ungleichmäßigen Aufteilung im Bereich möglicher Werte zu einer Verzerrung.

40
Stephen Kitt

Nicht standardmäßige Lösung:

[ $(date +%1N) == 1 ] && do_stuff

Überprüfen Sie, ob die letzte Ziffer der aktuellen Zeit in Nanosekunden 1 ist!

25
stackzebra

Eine Alternative zur Verwendung von $RANDOM ist der Befehl shuf:

[[ $(shuf -i 1-10 -n 1) == 1 ]] && do_stuff

wird den Job machen. Auch nützlich zum zufälligen Auswählen von Zeilen aus einer Datei, z. für eine Musikwiedergabeliste.

21
seumasmac

Verbessern Sie die erste Antwort und machen Sie deutlich, was Sie erreichen möchten:

[ $(( $RANDOM % 10 )) == 0 ] && echo "You win" || echo "You lose"
12
Eisenknurr

Ich bin mir nicht sicher, ob Sie Zufälligkeit oder Periodizität wollen ... Für Periodizität:

for i in `seq 1 10 100`; do echo $i;done
1
11
21
31
41
51
61
71
81
91

Sie können es mit dem obigen Trick "$ RANDOM" mischen, um etwas Chaotischeres zu erzeugen, zum Beispiel:

für ich in seq 1 1000 $RANDOM; Echo $ i; fertig

HTH :-)

1
Dr_ST