Saya ingin menjalankan salah satu dari dua perintah C1
dan C2
secara acak. Bagaimana saya melakukannya di commandline (bash)? Akan menghargai jika one-liner dimungkinkan.
24
if (( RANDOM % 2 )); then C1; else C2; fi
(( RANDOM % N == 0 ))
daripada(( RANDOM % N ))
. Hanya dalam kasus khusus N = 2 bahwa ini memiliki probabilitas yang identik.== 0
tersirat dalam((
blok tanpa perbandingan, jadi saya tidak yakin apa yang Anda maksud.== 0
adalah salah ketik di komentar saya sebelumnya, maksud saya> 0
implisit. Karena% 100
hampir selalu mengembalikan nilai di atas0
, itu yang diharapkan.RANDOM % $N
tanpa== 0
? IMO, misalnya dengan N = 100, jauh lebih pragmatis untuk menginginkan peluang 1 dalam 100 (dikirim bersama== 0
) daripada peluang 99 dalam 100 (disampaikan tanpa== 0
).Dalam kasus khusus Anda:
akan bekerja :) Dan hei, itu jawaban terpendek!
sumber
$((1+1))
->2
, mis.$(( ))
menghitung apa yang ada di dalamnya.Anda dapat melakukan sesuatu seperti ini di Bash:
Ini akan menghasilkan angka acak, baik 0 atau 1. Jika 0, maka C1 berjalan, jika tidak C2 berjalan jika tidak.
contoh
CATATAN: Karakter pertama
$
,, adalah prompt.contoh lain
Jika Anda khawatir dengan C1 yang harus gagal agar C2 dapat berjalan, Anda dapat merestrukturisasi seperti di atas:
mengapa menggunakan ini pada pernyataan if / then?
Jawaban ini telah dikritik sedikit tetapi ada metode untuk kegilaan saya. Meskipun pola ini mungkin tampak lebih tidak jelas daripada jika / maka saya merasa lebih mudah dibaca dan kompak ketika melakukan sesuatu seperti berikut:
Referensi
sumber
C2
jikaC1
gagal, yang melanggar spesifikasi yang tercantum dalam pertanyaan (yaitu, bahwa hanya satu dari perintah yang dijalankan).x && y || z
tidak setara denganif x; then y; else z; fi
.C1
adalah perintah yang terkadang mengembalikan kode keluar yang tidak nol, Anda akan berakhir mengeksekusi keduanyaC1
danC2
ketika itu terjadi.((...))
sebagai ganti[...]
- tanda kurung ganda khusus untuk ekspresi aritmatika.