Antworten:
if (( RANDOM % 2 )); then C1; else C2; fi
== 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 über 0
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:
C$((RANDOM%2+1))
wird funktionieren :) Und hey, es ist die kürzeste Antwort!
$((1+1))
-> 2
, zB. $(( ))
berechnet was drin ist.
In Bash können Sie so etwas tun:
$ (( RANDOM%2 == 0 )) && C1 || C2
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.
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
1
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
0
HINWEIS: Das erste Zeichen $
ist die Eingabeaufforderung.
Wenn Sie befürchten, dass C1 ausfallen muss, damit C2 ausgeführt werden kann, können Sie die obigen Schritte folgendermaßen umstrukturieren:
(( RANDOM%2 == 0 )) && CMD=C1 || CMD=C2
$CMD
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:
#!/bin/bash
CMD=""
DIRS="/etc /home /www /data1 /data2 /var/log /var/spool/mail"
FILE="/backup/$(hostname)-$(date +'%m-%d-%y').tar.gz"
[ "$1" == "nas" ] && CMD="lftp -u user,password -e 'cd /dump/; mput /backup/*; quit' nas.mylan.com" || :
[ "$1" == "scp" ] && CMD="scp /backup/* scponly@dumpserver:incoming' username" || :
[ "$1" == "tape" ] && CMD='tar -cf /dev/st0 /backup/*' || :
[ "$CMD" == "" ] && exit 1 || :
# make a backup
tar -zcvf $FILE $DIRS
# Now depend upon circumstances run a backup command
$CMD
C2
wenn ein C1
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 mit if 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ühren C1
und C2
wenn dies passiert.
((...))
statt [...]
- doppelte Klammern sind speziell für arithmetische Ausdrücke.
(( RANDOM % N == 0 ))
eher verwenden müssen als(( RANDOM % N ))
. Nur im Sonderfall von N = 2 haben diese die gleiche Wahrscheinlichkeit.