Tôi muốn chạy một trong hai lệnh C1
và C2
ngẫ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ể.
Tôi muốn chạy một trong hai lệnh C1
và C2
ngẫ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:
if (( RANDOM % 2 )); then C1; else C2; fi
== 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ì.
== 0
là một lỗi đánh máy trong bình luận trước đây của tôi, ý tôi > 0
là ẩn. Vì % 100
hầu như sẽ luôn trả về một giá trị ở trên 0
, điều đó được mong đợi.
RANDOM % $N
khô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
).
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!
$((1+1))
-> 2
, vd. $(( ))
tính toán những gì bên trong.
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.
$ (( 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.
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
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
C2
nếu C1
thấ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 || z
không tương đương với if x; then y; else z; fi
.
C1
mộ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 C1
và C2
khi điều đó xảy ra.
((...))
thay vì [...]
- dấu ngoặc kép dành riêng cho biểu thức số học.
(( 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.