Komutları rastgele çalıştır


24

İki komuttan birini C1ve C2rastgele çalıştırmak istiyorum . Bunu komut satırında (bash) nasıl yaparım? Bir astarın mümkün olup olmadığını takdir edecektir.

Yanıtlar:


33
if (( RANDOM % 2 )); then C1; else C2; fi

1
Eğer C1 çalışan N oran bir adet 1 isterseniz, muhtemelen kullanması gerektiğini akılda Ayı (( RANDOM % N == 0 ))ziyade (( RANDOM % N )). Bunların yalnızca N = 2 olması durumunda, olasılıkları aynı olabilir.
Acumenus,

@ ABB == 0, ((karşılaştırma yapılmayan bloklarda örtülü olduğundan, ne demek istediğinizi tam olarak anlamadım.
Chris Down,

@ABB == 0önceki yorumumda bir yazım hatası, demek istediğim > 0dolaylı. Yana % 100hemen hemen her zaman üstünde bir değer dönecektir 0bekleniyor.
Chris Down,

2
Açıkçası neyi pratik kullanım olacağını arasında, koymak RANDOM % $Nolmadan == 0? IMO, örneğin N = 100 ile, 100'de bir (100'lük bir oran) 1 (100'ünde == 0) (1'şer adet ) verilen orandan istemek çok daha pratiktir == 0.
Acumenus

21

Özel durumunuzda:

C$((RANDOM%2+1))

çalışacak :) Ve hey, bu en kısa cevap!


Neden etrafındaki iki parantez grubuna ihtiyaç duyuyor? Ben ne kullandıysan çok aşina değilim.
AJMansfield

2
@ AJMansfield $((1+1))-> 2, örn. $(( ))İçinde ne olduğunu hesaplar.
Tyilo

3
OP, C0 ve C1'i seçtiğinde daha kısa olacaktır. Belki programcı değildir?
ott--

2
C1 ve C2'nin çalıştırmak için gerçek komutlardan ziyade yer tutucu olduğundan eminim. :-)
Chris Down,

Bu çok hoş. +1
sudo

5

Bash'de böyle bir şey yapabilirsiniz:

$ (( RANDOM%2 == 0 )) && C1 || C2

Bu, 0 veya 1 olan rasgele bir sayı oluşturur. Eğer 0 ise, C1 çalışır, yoksa C2 çalışır.

örnek

$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
1

$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
0

Not: İlk karakter, $komut istemidir.

başka bir örnek

C1'in başarısız olması ve böylece C2'nin çalışabilmesi için endişeleniyorsanız, yukarıdaki gibi yeniden yapılandırabilirsiniz:

(( RANDOM%2 == 0 )) && CMD=C1 || CMD=C2
$CMD

neden bunu if / then ifadesi üzerinde kullanıyorsunuz?

Bu cevap biraz eleştirildi ama deliliğimin bir yöntemi var. Her ne kadar bu desen bir if'den daha belirsiz görünse de, aşağıdaki gibi bir şey yaparken daha okunaklı ve kompakt buluyorum:

#!/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

Referanslar


2
Bu çalışacaktır C2eğer C1söz konusu düzenlendiği şartname ihlal eden başarısız (yani sadece o, bir komutların run). x && y || zeşdeğer değildir if x; then y; else z; fi.
Chris Down,

@ChrisDown - modları görün.
slm

4
Düzenleme nominal olarak bunu düzeltir, ancak gerçekten belirsiz. “C2'nin çalışabilmesi için başarısız olması gerektiğinden C1 ile ilgileniyorsanız” senaryoyu hiçbir şekilde ele geçirmiyor. Sorun eğer ki C1bazen sıfırdan farklı çıkış kodu döndürür bir komuttur, her iki yürütme sona erecek C1ve C2bu olduğunda.
üçlü,

+1 ((...))yerine [...]çift ​​parantez kullanmak yerine , özellikle aritmetik ifadeler kullanılır.
glenn jackman

@glennjackman - teşekkürler değişikliği yaptım.
slm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.