Як отримати випадковість у командному рядку?


11

Як довільно виконати одну команду у вказаному списку команд? Корисно для випадкового вибору звуку запуску, шпалер або виконання команд.

Як правило, якщо у мене є команди для виконання наступним чином, то як отримати випадковість?

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

Тоді я хочу виконувати випадково лише одну команду з вищезгаданих можливостей, коли виконується сценарій!

Як це зробити?


Практичний приклад: askubuntu.com/a/257471/163331
Парто

@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
Ви можете опублікувати його як власну відповідь - це тоді може заробити вам репутацію.
thomasrutter

корисне використання RANDOM, я прийняв!
Пандія

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

@Doval Я сказав, що у своїй відповіді ти це бачив?
thomasrutter

@neon_overload Моє погано, я пропустив це трохи.
Doval

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.