Ich möchte einen der beiden Befehle ausführen C1
und C2
nach dem Zufallsprinzip. Wie mache ich das auf der Kommandozeile (bash)? Würde mich freuen, wenn ein Einzeiler möglich ist.
24
if (( RANDOM % 2 )); then C1; else C2; fi
(( RANDOM % N == 0 ))
eher verwenden müssen als(( RANDOM % N ))
. Nur im Sonderfall von N = 2 haben diese die gleiche Wahrscheinlichkeit.== 0
ist implizit in((
Blöcken ohne Vergleich enthalten, daher bin ich mir nicht sicher, was du meinst.== 0
ist ein Tippfehler in meinem vorherigen Kommentar, ich meine,> 0
ist implizit. Da% 100
wird fast immer ein Wert über0
dem erwartet.RANDOM % $N
ohne welchen praktischen Nutzen== 0
? IMO, zum Beispiel mit N = 100, ist es viel pragmatischer, eine Quote von 1 zu 100 (geliefert mit== 0
) als eine Quote von 99 zu 100 (geliefert ohne== 0
) zu wollen.In Ihrem speziellen Fall:
wird funktionieren :) Und hey, es ist die kürzeste Antwort!
quelle
$((1+1))
->2
, zB.$(( ))
berechnet was drin ist.In Bash können Sie so etwas tun:
Dies erzeugt eine Zufallszahl, entweder 0 oder 1. Wenn es eine 0 ist, wird C1 ausgeführt, andernfalls wird C2 ausgeführt, wenn dies nicht der Fall ist.
Beispiel
HINWEIS: Das erste Zeichen
$
ist die Eingabeaufforderung.ein anderes Beispiel
Wenn Sie befürchten, dass C1 ausfallen muss, damit C2 ausgeführt werden kann, können Sie die obigen Schritte folgendermaßen umstrukturieren:
Warum sollte dies über einer if / then-Anweisung verwendet werden?
Diese Antwort wurde ein wenig kritisiert, aber es gibt eine Methode für meinen Wahnsinn. Obwohl dieses Muster dunkler erscheinen mag als ein Wenn / Dann finde ich es lesbarer und kompakter, wenn ich etwas wie das Folgende tue:
Verweise
quelle
C2
wenn einC1
Fehler auftritt, was gegen die in der Frage angegebene Spezifikation verstößt (nämlich, dass nur einer der Befehle ausgeführt wird).x && y || z
ist nicht gleichbedeutend mitif x; then y; else z; fi
.C1
es sich um einen Befehl handelt, der manchmal einen Exit-Code ungleich Null zurückgibt, Sie am Ende beide ausführenC1
undC2
wenn dies passiert.((...))
statt[...]
- doppelte Klammern sind speziell für arithmetische Ausdrücke.