Ответы:
if (( RANDOM % 2 )); then C1; else C2; fi
== 0
подразумевается в ((
блоках без сравнения, поэтому я не уверен, что вы имеете в виду.
== 0
- опечатка в моем предыдущем комментарии, я имею в виду > 0
неявный. Так % 100
как почти всегда будет возвращать значение выше 0
, это ожидается.
RANDOM % $N
без == 0
? IMO, например, с 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
ПРИМЕЧАНИЕ. Первый символ $
- это приглашение.
Если вы обеспокоены тем, что С1 может дать сбой, чтобы С2 мог работать, вы можете изменить структуру вышеупомянутого так:
(( RANDOM%2 == 0 )) && CMD=C1 || CMD=C2
$CMD
Этот ответ немного критиковали, но в моем безумии есть метод. Хотя этот шаблон может показаться более неясным, чем если /, тогда я нахожу его более читабельным и компактным при выполнении чего-то вроде следующего:
#!/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 они имеют одинаковую вероятность.