Как получить случайность в командной строке?


11

Как случайным образом выполнить одну команду в указанном списке команд? Полезно для случайного выбора звука при запуске, обоев или выполнения команд.

В общем, если у меня есть команды для выполнения следующим образом, то Как я могу получить случайность?

#!/bin/bash
<command_1>
<command_2>
<command_3>
.
.
.
<command_n>

Тогда я хочу выполнить случайным образом только одну команду из вышеупомянутых возможностей при запуске скрипта!

Как это сделать?


Практический пример: askubuntu.com/a/257471/163331
Parto

@Parto я уже добавил как ответ раньше
Pandya

Я не пытался ответить, просто приводил пример, где его можно использовать.
Парто

Ответы:


21

Переменная $RANDOM(фактически функция bash) возвращает случайное число от 0 до 32767 включительно.

Как правило, вы хотели бы ограничить его диапазон, разделив его на некоторое число и взять его остаток, например.

# output a random number 0 to 3
echo $((RANDOM % 4))

В этом упрощенном примере он будет слегка смещен для любого делителя, который не делится поровну на 32768 (например, все, что не является степенью двойки), но в вашем сценарии я не думаю, что вы будете обеспокоены с небольшим уклоном.

Чтобы выбрать случайный файл, вы должны назвать свои файлы примерно так:

file0.jpg
file1.jpg
file2.jpg
file3.jpg

И тогда вы можете выбрать случайный с

# output a random file from file0.jpg to file3.jpg
echo "file$((RANDOM % 4)).jpg"

1
Возможно, вы захотите опубликовать его как свой собственный ответ - тогда он может заработать вам репутацию.
Томасруттер

Полезное использование RANDOM, я принял!
Пандя

1
Обратите внимание, что RANDOM% N не приводит к одинаковому распределению, если только число возможных значений RANDOM (32768) не делится на N. Чтобы увидеть это, представьте, что диапазон RANDOM был 0-4 (5 возможных значений), и N равно 2: у $ RANDOM% 2 есть три способа получить 0 (если $ RANDOM дает 0, 2, 4), но есть два способа получить 1 (1, 3). Для равного распределения вам нужно найти наибольшее кратное N, которое меньше 32767, и игнорировать любые случайные значения, которые больше этого. В предыдущем примере это равносильно игнорированию 5, что больше 4.
Doval

@ Довал, я сказал это в своем ответе, ты видел это?
Томасруттер

@neon_overload Мой плохой, я пропустил этот бит.
Довал

7

В соответствии с ответом @neon_overload (используя RANDOM),
я могу привести RANDOMв качестве примера скрипт следующим образом (для 4 команд):

#!/bin/bash
random_selection=$((RANDOM % 4))

case $random_selection in

  0)
  <command_1>
  ;;

  1)
  <command_2>
  ;;

  2)
  <command_3>
  ;;

  3)
  <command_4>
  ;;

esac

2

Если вам нужна случайность через внешний сайт, а не сгенерированный вашим компьютером, вы можете использовать этот скрипт:

curl "http://www.random.org/integers/?num=1&min=$1&max=$2&col=1&base=10&format=plain&rnd=new"

Запуск от имени rand (MIN) (MAX) (при условии, что вы сохраняете как / usr / bin / rand)

Возможно, вам придется сначала установить curl (sudo apt-get install curl), если он еще не установлен.


0

Вы можете использовать shufкоманду из GNU coreutils .

NAME
       shuf - generate random permutations

SYNOPSIS
       shuf [OPTION]... [FILE]
       shuf -e [OPTION]... [ARG]...
       shuf -i LO-HI [OPTION]...

DESCRIPTION
       Write a random permutation of the input lines to standard output

Пример:

$ shuf -i 1-5
4
1
2
5
3

$ shuf -e Debian Ubuntu Trisquel 
Trisquel
Debian
Ubuntu

Теперь для получения одной случайной записи вы можете использовать -n 1вывод первой строки.

Пример для печати случайного числа от 1 до 100:

$ shuf -i 1-100 -n 1
37

Если у вас есть fileследующее содержание:

$ cat file
command-1
command-2
command-3
command-4
command-5

Вы также можете сделать что-то вроде:

$ shuf file -n 1
command-3
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.