Chạy các lệnh một cách ngẫu nhiên


24

Tôi muốn chạy một trong hai lệnh C1C2ngẫu nhiên. Làm thế nào để tôi làm điều đó trên dòng lệnh (bash)? Sẽ đánh giá cao nếu một lớp lót là có thể.

Câu trả lời:


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

1
Hãy nhớ rằng nếu bạn muốn tỷ lệ 1 trong N khi chạy C1, có lẽ bạn phải sử dụng (( RANDOM % N == 0 ))chứ không phải (( RANDOM % N )). Chỉ có trường hợp đặc biệt là N = 2 mà chúng có xác suất giống hệt nhau.
Acumenus

@ABB == 0ẩn trong ((các khối mà không có so sánh, vì vậy tôi không chắc ý của bạn là gì.
Chris Xuống

@ABB == 0là một lỗi đánh máy trong bình luận trước đây của tôi, ý tôi > 0là ẩn. Vì % 100hầu như sẽ luôn trả về một giá trị ở trên 0, điều đó được mong đợi.
Chris Xuống

2
Rõ ràng, những gì sử dụng thực tế sẽ RANDOM % $Nkhông có == 0? IMO, ví dụ với N = 100, sẽ thực tế hơn nhiều khi muốn tỷ lệ cược 1 trong 100 (được phân phối cùng == 0) so với tỷ lệ 99 trong 100 tỷ lệ cược (được phân phối mà không có == 0).
Acumenus

21

Trong trường hợp đặc biệt của bạn:

C$((RANDOM%2+1))

sẽ hoạt động :) Và này, đó là câu trả lời ngắn nhất!


Tại sao nó cần hai bộ dấu ngoặc quanh nó? Tôi chỉ không quen thuộc với bất cứ điều gì bạn sử dụng.
AJMansfield

2
@AJMansfield $((1+1))-> 2, vd. $(( ))tính toán những gì bên trong.
Tyilo

3
Nó sẽ còn ngắn hơn nữa nếu OP chọn C0 và C1. Có lẽ anh ấy không phải là một lập trình viên?
ott--

2
Tôi khá chắc chắn rằng C1 và C2 là trình giữ chỗ chứ không phải là các lệnh thực tế để chạy. :-)
Chris Xuống

Dễ thương đó. +1
sudo

5

Bạn có thể làm một cái gì đó như thế này trong Bash:

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

Điều này sẽ tạo ra một số ngẫu nhiên, 0 hoặc 1. Nếu là 0, thì C1 chạy, nếu không thì C2 chạy nếu không.

thí dụ

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

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

LƯU Ý: Ký tự đầu tiên $, là dấu nhắc.

một vi dụ khac

Nếu bạn lo lắng về việc C1 phải thất bại để C2 có thể chạy, bạn có thể cơ cấu lại như trên:

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

Tại sao sử dụng điều này trên một câu lệnh if / then?

Câu trả lời này đã bị chỉ trích một chút nhưng có một phương pháp cho sự điên rồ của tôi. Mặc dù mô hình này có vẻ mơ hồ hơn so với nếu / sau đó tôi thấy nó dễ đọc và gọn hơn khi thực hiện một số thứ như sau:

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

Tài liệu tham khảo


2
Điều này sẽ chạy C2nếu C1thất bại, vi phạm đặc tả được nêu trong câu hỏi (cụ thể là chỉ một trong số các lệnh được chạy). x && y || zkhông tương đương với if x; then y; else z; fi.
Chris Down

@ChrisDown - xem mod.
slm

4
Bản chỉnh sửa trên danh nghĩa sửa lỗi này, nhưng nó thực sự tối nghĩa. "Nếu bạn lo lắng về việc C1 phải thất bại để C2 có thể chạy" thì hoàn toàn không nắm bắt được kịch bản. Vấn đề là nếu C1một lệnh đôi khi trả về mã thoát khác không, thì cuối cùng bạn sẽ thực thi cả hai C1C2khi điều đó xảy ra.
tripleee

+1 nhưng sử dụng ((...))thay vì [...]- dấu ngoặc kép dành riêng cho biểu thức số học.
glenn jackman

@glennjackman - cảm ơn tôi đã thực hiện thay đổi.
slm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.