Правильный подход (никаких внешних процессов не генерируется) уже был представлен @Barmar в комментарии.
Если ОП необходимо это разгадали, вот оно:
angle=$(($RANDOM%61-30))
, но я хотел бы предложить худший вариант, так как кто-то сказал, что «хуже, тем лучше»
angle=$(seq -30 30 | shuf -n 1)
seq
помещает в stdout
последовательность целых чисел, символ новой строки,
shuf
случайным образом перетасовывает свой вход,
- опция
-n 1
означает выход только первый перемешиваются случайным образом линии,
так, что мы имеем, что мы генерируем колоду карт, пронумерованных -30
... +30
, мы перетасовать колоду и мы имеем дело только с первой картой.
В моем ответе то, что мне нравится, заключается в том, что диапазон решения сформулирован более четко, по крайней мере, из POV не математически наделенного человека.
наоборот это медленнее, чем использование $RANDOM
10:31 [email protected]:~ $ time for i in {1..10000} ; do echo > /dev/null ; done
real 0m0.077s
user 0m0.036s
sys 0m0.040s
10:32 [email protected]:~ $ time for i in {1..10000} ; do echo $(($RANDOM%61-30)) > /dev/null ; done
real 0m0.138s
user 0m0.116s
sys 0m0.020s
10:32 [email protected]:~ $ time for i in {1..10000} ; do echo $(seq -30 30|shuf -n 1) > /dev/null ; done
real 0m33.328s
user 0m0.372s
sys 0m4.560s
10:33 [email protected]:~ $
(с другой стороны, она занимает всего 3,3 мс, если вы используете его РАЗ в сценарии ... :-)
'$ RANDOM 'вернет случайное положительное число. Используйте '% 61', чтобы получить его в диапазоне от 0 до 60, а затем вычесть 30. – Barmar
Это просто простая арифметика. Если вы закончили среднюю школу, это должно быть очевидно. – Barmar