Запускайте команди навмання


24

Я хочу запустити одну з двох команд C1і C2навмання. Як це зробити в командному рядку (bash)? Будемо вдячні, якщо можливий однолінійний.

Відповіді:


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

1
Майте на увазі, що якщо ви хочете, щоб коефіцієнт 1 на N був запущений C1, ви, ймовірно, повинні використовувати, (( RANDOM % N == 0 ))а не (( RANDOM % N )). Тільки в спеціальному випадку N = 2 вони мають однакову ймовірність.
Акумен

@ABB == 0неявне в ((блоках без порівняння, тому я не впевнений, що ти маєш на увазі.
Кріс Даун

@ABB == 0- помилка друку в попередньому коментарі, я маю на увазі > 0неявний. Оскільки % 100майже завжди буде повертати значення вище 0, це очікується.
Кріс Даун

2
Зрозуміло кажучи, яке практичне використання було б RANDOM % $Nбез цього == 0? ІМО, наприклад, з N = 100, набагато прагматичніше бажати коефіцієнта 1 на 100 (поставляється з == 0), ніж коефіцієнта 99 на 100 (поставлено без == 0).
Acumenus

21

У вашому спеціальному випадку:

C$((RANDOM%2+1))

буде працювати :) І ей, це найкоротша відповідь!


Чому для цього потрібні два набори дужок? Я просто не дуже знайомий з тим, чим ти користувався.
AJMansfield

2
@AJMansfield $((1+1))-> 2, напр. $(( ))обчислює те, що знаходиться всередині.
Тиїло

3
Це було б ще коротше, якби ОП обрала C0 та C1. Може, він не програміст?
ott--

2
Я майже впевнений, що C1 і C2 були заповнювачами замість фактичних команд для запуску. :-)
Chris Down

Це мило. +1
судо

5

Ви можете зробити щось подібне на 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 / then?

Цю відповідь трохи критикували, але є метод мого божевілля. Хоча ця модель може здатися більш незрозумілою, ніж 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

Список літератури


2
Це запуститься, C2якщо C1не вдасться, що порушує специфікацію, викладену у питанні (а саме, що виконується лише одна з команд). x && y || zне рівнозначно if x; then y; else z; fi.
Кріс Даун

@ChrisDown - перегляньте модники.
slm

4
Правка номінально виправляє це, але це справді малозрозуміло. "Якщо ви переймаєтесь тим, що C1 повинен вийти з ладу, щоб C2 запустився", це зовсім не фіксує сценарій. Проблема полягає в тому, що якщо C1це команда, яка іноді повертає ненульовий код виходу, ви в кінцевому підсумку виконаєте і те, C1і C2коли це станеться.
tripleee

+1, але використовувати ((...))замість [...]- подвійні дужки спеціально для арифметичних виразів.
glenn jackman

@glennjackman - дякую, що я внесла зміни.
slm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.