Переменная, случайно выбранная из трех чисел (10, 100 и 1000)

Вы поместили токен глобуса * не в то место, если перед : , если вы используете ## (или # ]), чтобы избавиться от части слева:

${PATH#*:}  ## Non-greedy
${PATH##*:}  ## Greedy
19
16.12.2016, 22:53
5 ответов

Используйте массив для хранения значений и выбирайте между ними с помощью встроенной переменной $RANDOM. Например,

x[0]=10     # One decade
x[1]=100    # One century
x[2]=1000   # One millennium

for ((i=1; i < 20; ++i)); do echo -n " ${x[$RANDOM%3]}"; done; echo
1000 10 10 10 10 100 10 100 100 10 10 100 100 100 10 1000 1000 1000 10

Качество случайности не будет наилучшим (для этого считайте байты из /dev/urandom),но это должно быть более чем достаточно хорошо для сценария.

Примечание 1: Как заметили люди в комментариях, вместо инициализации элементов массива по отдельности можно, конечно, использовать массив litteral: x=(10 100 1000).

Примечание 2: Вместо жесткого кодирования количества элементов в массиве, элемент radom может быть извлечен ${x[$RANDOM%${#x[@]}]}.

31
27.01.2020, 19:44
case $(( RANDOM % 3 )) in
    0)
        var=10
        ;;
    1)
        var=100
        ;;
    2)
        var=1000
        ;;
esac
8
27.01.2020, 19:44

Если вы используете bash (или zsh или ksh93), вы можете просто сделать:

echo "$((10**($RANDOM%3+1)))"

или

var=$((10**($RANDOM%3+1)))

назначить его на var

29
27.01.2020, 19:44

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

a=$(shuf -n1 -e 10 100 1000)

Использование RANDOM в соответствии с другими ответами почти наверняка быстрее.

20
27.01.2020, 19:44

Вот немного загадочный способ:

printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0

Это присвоит случайное значение ] $ var по мере необходимости. Строка формата printf имеет вид 1% 0Nd - это приводит к тому, что 0 печатается с N начальными нулями, где N будет случайным целым числом в интервале [1,3] .

5
27.01.2020, 19:44

Теги

Похожие вопросы