Имейте в виду, что если вы хотите, чтобы шансы С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).
Если вы обеспокоены тем, что С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
Он будет работать в C2случае C1сбоя, что нарушает спецификацию, изложенную в вопросе (а именно, что выполняется только одна из команд). x && y || zне является эквивалентом if x; then y; else z; fi.
Крис Даун
@ChrisDown - смотрите моды.
SLM
4
Редактирование формально исправляет это, но это действительно неясно. «Если вы беспокоитесь о том, что С1 может дать сбой, чтобы С2 мог работать», сценарий вообще не фиксируется. Проблема заключается в том, что если C1это команда, которая иногда возвращает ненулевой код завершения, вы в конечном итоге выполните и то, C1и другое, C2когда это произойдет.
tripleee
+1, но используйте ((...))вместо [...]- двойные скобки специально для арифметических выражений.
(( RANDOM % N == 0 ))
вместо(( RANDOM % N ))
. Только в особом случае N = 2 они имеют одинаковую вероятность.== 0
подразумевается в((
блоках без сравнения, поэтому я не уверен, что вы имеете в виду.== 0
- опечатка в моем предыдущем комментарии, я имею в виду> 0
неявный. Так% 100
как почти всегда будет возвращать значение выше0
, это ожидается.RANDOM % $N
без== 0
? IMO, например, с N = 100, гораздо более прагматично хотеть шансы 1 на 100 (поставляются с== 0
), чем шансы 99 на 100 (поставляться без== 0
).В вашем особом случае:
будет работать :) И эй, это самый короткий ответ!
источник
$((1+1))
->2
, например.$(( ))
вычисляет, что внутри.Вы можете сделать что-то вроде этого в Bash:
Это сгенерирует случайное число, 0 или 1. Если это 0, то запускается C1, в противном случае запускается C2, если это не так.
пример
ПРИМЕЧАНИЕ. Первый символ
$
- это приглашение.другой пример
Если вы обеспокоены тем, что С1 может дать сбой, чтобы С2 мог работать, вы можете изменить структуру вышеупомянутого так:
зачем использовать это вместо оператора if / then?
Этот ответ немного критиковали, но в моем безумии есть метод. Хотя этот шаблон может показаться более неясным, чем если /, тогда я нахожу его более читабельным и компактным при выполнении чего-то вроде следующего:
Ссылки
источник
C2
случаеC1
сбоя, что нарушает спецификацию, изложенную в вопросе (а именно, что выполняется только одна из команд).x && y || z
не является эквивалентомif x; then y; else z; fi
.C1
это команда, которая иногда возвращает ненулевой код завершения, вы в конечном итоге выполните и то,C1
и другое,C2
когда это произойдет.((...))
вместо[...]
- двойные скобки специально для арифметических выражений.