Я хочу запустити одну з двох команд C1
і C2
навмання. Як це зробити в командному рядку (bash)? Будемо вдячні, якщо можливий однолінійний.
Я хочу запустити одну з двох команд C1
і C2
навмання. Як це зробити в командному рядку (bash)? Будемо вдячні, якщо можливий однолінійний.
Відповіді:
if (( RANDOM % 2 )); then C1; else C2; fi
== 0
неявне в ((
блоках без порівняння, тому я не впевнений, що ти маєш на увазі.
== 0
- помилка друку в попередньому коментарі, я маю на увазі > 0
неявний. Оскільки % 100
майже завжди буде повертати значення вище 0
, це очікується.
RANDOM % $N
без цього == 0
? ІМО, наприклад, з 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
Цю відповідь трохи критикували, але є метод мого божевілля. Хоча ця модель може здатися більш незрозумілою, ніж if /, тоді я вважаю її більш зрозумілою та компактною, коли роблю щось подібне:
#!/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 вони мають однакову ймовірність.