ฉันต้องการเรียกใช้หนึ่งในสองคำสั่งC1
และC2
โดยการสุ่ม ฉันจะทำเช่นนั้นใน commandline (bash) ได้อย่างไร จะซาบซึ้งถ้าเป็นไปได้หนึ่งซับ
ฉันต้องการเรียกใช้หนึ่งในสองคำสั่งC1
และC2
โดยการสุ่ม ฉันจะทำเช่นนั้นใน commandline (bash) ได้อย่างไร จะซาบซึ้งถ้าเป็นไปได้หนึ่งซับ
คำตอบ:
if (( RANDOM % 2 )); then C1; else C2; fi
== 0
มีความหมายใน((
บล็อกโดยไม่มีการเปรียบเทียบดังนั้นฉันไม่แน่ใจว่าคุณหมายถึงอะไร
== 0
เป็นตัวพิมพ์ผิดในความคิดเห็นก่อนหน้าของฉันฉันหมายถึง> 0
เป็นนัย เนื่องจาก% 100
จะส่งคืนค่าข้างต้นเกือบทุก0
ครั้งนั่นเป็นสิ่งที่คาดไว้
RANDOM % $N
โดยไม่== 0
? IMO เช่นที่มี N = 100 มันเป็นวิธีปฏิบัติที่ดีกว่าหากต้องการอัตรา 1 ใน 100 (ส่งโดยมี== 0
) มากกว่า 99 ใน 100 อัตราต่อรอง (ส่งโดยไม่มี== 0
)
ในกรณีพิเศษของคุณ:
C$((RANDOM%2+1))
จะทำงาน :) และเฮ้มันเป็นคำตอบที่สั้นที่สุด!
$((1+1))
-> 2
เช่น $(( ))
คำนวณสิ่งที่อยู่ภายใน
คุณสามารถทำสิ่งนี้ใน Bash:
$ (( RANDOM%2 == 0 )) && C1 || C2
สิ่งนี้จะสร้างตัวเลขสุ่มทั้ง 0 หรือ 1 หากเป็น 0 ดังนั้นจะมี C1 เรียกใช้มิฉะนั้น C2 จะเรียกใช้หากไม่เป็นเช่นนั้น
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
1
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
0
หมายเหตุ: ตัวอักษรตัวแรก$
, เป็นพรอมต์
หากคุณกังวลว่า C1 จะต้องล้มเหลวเพื่อให้ C2 สามารถทำงานคุณสามารถปรับโครงสร้างด้านบนดังนี้:
(( RANDOM%2 == 0 )) && CMD=C1 || CMD=C2
$CMD
คำตอบนี้ได้รับการวิพากษ์วิจารณ์เล็กน้อย แต่มีวิธีการบ้าของฉัน แม้ว่ารูปแบบนี้อาจดูคลุมเครือกว่าถ้า / จากนั้นฉันพบว่าสามารถอ่านได้และมีขนาดกะทัดรัดกว่าเมื่อทำสิ่งต่อไปนี้:
#!/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
ถ้าC1
ล้มเหลวที่ละเมิดข้อกำหนดออกมาวางในคำถาม (คือว่ามีเพียงหนึ่งของคำสั่งที่มีการเรียกใช้) จะไม่เทียบเท่ากับx && y || z
if x; then y; else z; fi
C1
เป็นคำสั่งซึ่งบางครั้งส่งคืนโค้ดออกที่ไม่เป็นศูนย์คุณจะสิ้นสุดการดำเนินการทั้งสองC1
และC2
เมื่อเกิดขึ้น
((...))
แทน[...]
- วงเล็บคู่นั้นมีไว้สำหรับนิพจน์ทางคณิตศาสตร์โดยเฉพาะ
(( RANDOM % N == 0 ))
(( RANDOM % N ))
มันเป็นกรณีพิเศษของ N = 2 เท่านั้นที่มีความน่าจะเป็นเหมือนกัน