Chcę uruchomić jedno z dwóch poleceń C1
i C2
losowo. Jak to zrobić w linii poleceń (bash)? Doceni, jeśli możliwy jest jednowarstwowy wkład.
Chcę uruchomić jedno z dwóch poleceń C1
i C2
losowo. Jak to zrobić w linii poleceń (bash)? Doceni, jeśli możliwy jest jednowarstwowy wkład.
Odpowiedzi:
if (( RANDOM % 2 )); then C1; else C2; fi
== 0
jest niejawne w ((
blokach bez porównania, więc nie jestem pewien, co masz na myśli.
== 0
to literówka w moim poprzednim komentarzu, to znaczy > 0
niejawna. Ponieważ % 100
prawie zawsze zwróci wartość powyżej 0
, jest to oczekiwane.
RANDOM % $N
bez == 0
? IMO, na przykład przy N = 100, pragnienie pragnienia 1 na 100 (dostarczanego z == 0
) jest znacznie bardziej pragmatyczne niż 99 na 100 (dostarczanego bez == 0
).
W twoim specjalnym przypadku:
C$((RANDOM%2+1))
zadziała :) Hej, to najkrótsza odpowiedź!
$((1+1))
-> 2
, np. $(( ))
oblicza, co jest w środku.
Możesz zrobić coś takiego w Bash:
$ (( RANDOM%2 == 0 )) && C1 || C2
To wygeneruje liczbę losową, 0 lub 1. Jeśli jest to 0, wtedy C1 działa, w przeciwnym razie C2 działa, jeśli nie jest.
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
1
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
0
UWAGA: Pierwszy znak $
, to znak zachęty.
Jeśli obawiasz się, że C1 musi zawieść, aby C2 mógł działać, możesz zrestrukturyzować powyższe w następujący sposób:
(( RANDOM%2 == 0 )) && CMD=C1 || CMD=C2
$CMD
Ta odpowiedź została trochę skrytykowana, ale w moim szaleństwie jest metoda. Chociaż ten wzór może wydawać się bardziej niejasny niż jeśli / to, uważam go za bardziej czytelny i zwarty, gdy wykonuję coś takiego:
#!/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
jeśli C1
zawiedzie, co narusza specyfikację przedstawioną w pytaniu (a mianowicie, że uruchamiana jest tylko jedna komenda). x && y || z
nie jest równoważne z if x; then y; else z; fi
.
C1
jest to polecenie, które czasami zwraca niezerowy kod wyjścia, wykonasz oba C1
i C2
kiedy to się stanie.
((...))
zamiast [...]
- podwójne nawiasy są specyficzne dla wyrażeń arytmetycznych.
(( RANDOM % N == 0 ))
raczej musisz użyć zamiast(( RANDOM % N ))
. Tylko w wyjątkowym przypadku N = 2 prawdopodobieństwo jest identyczne.