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.
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.
Jawaban:
if (( RANDOM % 2 )); then C1; else C2; fi
== 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 atas 0
, 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:
C$((RANDOM%2+1))
akan bekerja :) Dan hei, itu jawaban terpendek!
$((1+1))
-> 2
, mis. $(( ))
menghitung apa yang ada di dalamnya.
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.
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
1
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
0
CATATAN: Karakter pertama $
,, adalah prompt.
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
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
C2
jika C1
gagal, yang melanggar spesifikasi yang tercantum dalam pertanyaan (yaitu, bahwa hanya satu dari perintah yang dijalankan). x && y || z
tidak setara dengan if x; then y; else z; fi
.
C1
adalah perintah yang terkadang mengembalikan kode keluar yang tidak nol, Anda akan berakhir mengeksekusi keduanya C1
dan C2
ketika itu terjadi.
((...))
sebagai ganti [...]
- tanda kurung ganda khusus untuk ekspresi aritmatika.
(( RANDOM % N == 0 ))
daripada(( RANDOM % N ))
. Hanya dalam kasus khusus N = 2 bahwa ini memiliki probabilitas yang identik.