Проблема заключалась в конфигурации сервера tftpd-hpa на хосте.
Согласно руководству файл /etc/default/tftpd-hpa
должен иметь вид:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/bogdan_liulko/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
RUN_DAEMON="yes"
Моя проблема была в том, что в моем файле не было параметра --create
в TFT_OPTIONS
. И сразу после выполнения всех шагов из руководства все заработало как надо.
Один из способов :создать параллельный массив с соответствующими шансами в процентах; ниже я масштабировал их до 1000. Затем выберите случайное число от 1 до 1000 и перебирайте массив, пока не закончатся все шансы:
#!/bin/bash
array=( "foo" "bar" "baz")
chances=(733 266 1)
choice=$((1 + (RANDOM % 1000)))
value=
for((index=0; index < ${#array[@]}; index++))
do
choice=$((choice - ${chances[index]}))
if [[ choice -le 0 ]]
then
value=${array[index]}
break
fi
done
[[ index -eq ${#array[@]} ]] && value=${array[index]}
printf '%s\n' "$value"
Оболочка не может выполнять математические операции с плавающей запятой, но если мы просто переместим десятичную точку, мы сможем использовать $RANDOM
и целочисленные математические операции:
#!/usr/local/bin/bash
array=("foo" "bar" "baz")
dieroll=$(($RANDOM % 1000))
if [[ "$dieroll" -lt 1 ]]; then
printf "%s\n" "${array[2]}"
elif [[ "$dieroll" -lt 266 ]]; then
printf "%s\n" "${array[1]}"
else
printf "%s\n" "${array[0]}"
fi
Преимущество этого заключается в том, что не нужно раздувать массив до 1000 записей или использовать какие-либо for
циклы.