Выполнять команды наугад


24

Я хочу выполнить одну из двух команд C1и C2наугад. Как мне это сделать в командной строке (bash)? Буду признателен, если возможен однострочник.

Ответы:


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

1
Имейте в виду, что если вы хотите, чтобы шансы С1 равнялись 1 к N, вы, вероятно, должны использовать (( RANDOM % N == 0 ))вместо (( RANDOM % N )). Только в особом случае N = 2 они имеют одинаковую вероятность.
Acumenus

@ABB == 0подразумевается в ((блоках без сравнения, поэтому я не уверен, что вы имеете в виду.
Крис Даун

@ABB == 0- опечатка в моем предыдущем комментарии, я имею в виду > 0неявный. Так % 100как почти всегда будет возвращать значение выше 0, это ожидается.
Крис Даун

2
Толком говоря, о том, что практическое применение было бы RANDOM % $Nбез == 0? IMO, например, с N = 100, гораздо более прагматично хотеть шансы 1 на 100 (поставляются с == 0), чем шансы 99 на 100 (поставляться без == 0).
Acumenus

21

В вашем особом случае:

C$((RANDOM%2+1))

будет работать :) И эй, это самый короткий ответ!


Зачем ему нужно два набора скобок вокруг него? Я просто не очень знаком с тем, что вы использовали.
AJMansfield

2
@AJMansfield $((1+1))-> 2, например. $(( ))вычисляет, что внутри.
Tyilo

3
Было бы еще короче, если бы ОП выбрал С0 и С1. Может он не программист?
ot--

2
Я почти уверен, что C1 и C2 были заполнителями, а не фактическими командами для запуска. :-)
Крис Даун

Это мило. +1
sudo

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

ПРИМЕЧАНИЕ. Первый символ $- это приглашение.

другой пример

Если вы обеспокоены тем, что С1 может дать сбой, чтобы С2 мог работать, вы можете изменить структуру вышеупомянутого так:

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

зачем использовать это вместо оператора if / then?

Этот ответ немного критиковали, но в моем безумии есть метод. Хотя этот шаблон может показаться более неясным, чем если /, тогда я нахожу его более читабельным и компактным при выполнении чего-то вроде следующего:

#!/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
Редактирование формально исправляет это, но это действительно неясно. «Если вы беспокоитесь о том, что С1 может дать сбой, чтобы С2 мог работать», сценарий вообще не фиксируется. Проблема заключается в том, что если C1это команда, которая иногда возвращает ненулевой код завершения, вы в конечном итоге выполните и то, C1и другое, C2когда это произойдет.
tripleee

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

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