Я хочу запустити одну з двох команд 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 вони мають однакову ймовірність.