Jalankan perintah secara acak

24

Saya ingin menjalankan salah satu dari dua perintah C1dan C2secara acak. Bagaimana saya melakukannya di commandline (bash)? Akan menghargai jika one-liner dimungkinkan.

pengguna13107
sumber

Jawaban:

33
if (( RANDOM % 2 )); then C1; else C2; fi
Chris Down
sumber
1
Ingatlah bahwa jika Anda ingin peluang 1 in N menjalankan C1, Anda mungkin harus menggunakan (( RANDOM % N == 0 ))daripada (( RANDOM % N )). Hanya dalam kasus khusus N = 2 bahwa ini memiliki probabilitas yang identik.
Acumenus
@ ABB == 0tersirat dalam ((blok tanpa perbandingan, jadi saya tidak yakin apa yang Anda maksud.
Chris Down
@ABB == 0adalah salah ketik di komentar saya sebelumnya, maksud saya > 0implisit. Karena % 100hampir selalu mengembalikan nilai di atas 0, itu yang diharapkan.
Chris Down
2
Sederhananya, penggunaan praktis apa yang akan RANDOM % $Ntanpa == 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).
Acumenus
21

Dalam kasus khusus Anda:

C$((RANDOM%2+1))

akan bekerja :) Dan hei, itu jawaban terpendek!

gniourf_gniourf
sumber
Mengapa perlu dua set tanda kurung di sekitarnya? Saya hanya tidak begitu akrab dengan apa pun yang Anda gunakan.
AJMansfield
2
@AJMansfield $((1+1))-> 2, mis. $(( ))menghitung apa yang ada di dalamnya.
Tyilo
3
Akan lebih pendek jika OP memilih C0 dan C1. Mungkin dia bukan programmer?
ott--
2
Saya cukup yakin bahwa C1 dan C2 adalah placeholder daripada perintah yang sebenarnya untuk dijalankan. :-)
Chris Down
Imut. +1
sudo
5

Anda dapat melakukan sesuatu seperti ini di Bash:

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

Ini akan menghasilkan angka acak, baik 0 atau 1. Jika 0, maka C1 berjalan, jika tidak C2 berjalan jika tidak.

contoh

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

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

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:

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

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:

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

Referensi

slm
sumber
2
Ini akan berjalan C2jika C1gagal, yang melanggar spesifikasi yang tercantum dalam pertanyaan (yaitu, bahwa hanya satu dari perintah yang dijalankan). x && y || ztidak setara dengan if x; then y; else z; fi.
Chris Down
@ChrisDown - lihat mod.
slm
4
Hasil edit secara nominal memperbaiki ini, tetapi ini benar-benar tidak jelas. "Jika Anda khawatir dengan C1 harus gagal sehingga C2 dapat berjalan" tidak menangkap skenario sama sekali. Masalahnya adalah jika C1adalah perintah yang terkadang mengembalikan kode keluar yang tidak nol, Anda akan berakhir mengeksekusi keduanya C1dan C2ketika itu terjadi.
tripleee
+1 tetapi gunakan ((...))sebagai ganti [...]- tanda kurung ganda khusus untuk ekspresi aritmatika.
glenn jackman
@glennjackman - terima kasih saya telah membuat perubahan.
slm