common/utils.c 69 :невозможно открыть /var/lib/hp/hplip.state
создайте hplip.state, используя привилегии суперпользователя, а затем установите подключаемые модули hp, которые могут вам понадобиться для этого, на компьютере клиента/пользователя, если они не могут печатать.
Вы можете использовать синтаксис раскрытия параметра${var:offset:length}
для извлечения подстроки значения:
$ nanoseconds=$(date +%N)
$ printf '%s\n' "$nanoseconds" "${nanoseconds:2:4}"
785455000
5455
Или, как было предложено, используя /dev/urandom:
$ tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n 10
8386
9194
3897
8790
4738
1453
4323
9021
6033
8889
Чтение этого в массив с помощью команды bash mapfile
:
$ mapfile -t numArray < <(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n 10)
$ declare -p numArray
declare -a numArray=([0]="2851" [1]="9684" [2]="5823" [3]="5206" [4]="3208" [5]="2914" [6]="0395" [7]="4128" [8]="1876" [9]="5691")
Мой первоначальный подход заключался в использовании обработки строк для вывода date
, чтобы получить требуемые значения. Версия здесь использует математическую обработку (деление на 1000000 по модулю 10000 ), но я оставил для вас альтернативный комментарий
#!/bin/bash
items=()
random=$(( ($(date +%s%N) / 1000000) % 10000 )) # Second and milliseconds
# random=$( date +%s%N | grep -oP '....(?=......$)' )
items+=($random) # Append value to array
echo "${items[0]}" # First array value
echo "${items[-1]}" # Last (most recently appended) value
declare -p items # Visual inspection of array elements
Если вы запустите date +%s%N
, вывод будет выглядеть примерно так:
1622046533072036066
ssssssssssmmmuuunnn
с правыми -цифрами, указывающими меньшие единицы.(m
/ u
/ n
для милли -/ микро -/ наносекунд.)
Если вы разделите это число на 1000000, как это делает $((... / 1000000))
, вы удалите шесть крайних правых цифр, оставив только секунды и миллисекунды.
Они не очень случайны. Например. в вашем тестовом прогоне последовательные выходные числа увеличиваются на несколько последовательных 508, что в миллисекундах точно соответствует запрошенным вами 0,5 секунды.
Скорее всего, вы получите больше случайных значений, если вместо этого сохраните самые правые цифры и отбросите начальные, например. с оператором по модулю, $((... % 1000000))
. Хотя возможно, что самые младшие цифры также не очень случайны, если в системе нет часов с достаточно мелкой детализацией.
Если вы сохраняете только младшие цифры, вам не обязательно date
выводить полные секунды, вместо этого можно использовать только +%N
, за исключением того, что значение наносекунд всегда равно нулю -, дополненному до 9 цифры, а Bash обрабатывает числа, начинающиеся с нулей, как восьмеричные, например 092345678
приведет к ошибке. Добавление дополнительной цифры впереди предотвратит это, но то же самое можно сделать и с добавлением значения секунд.
В моей системе разница между значениями последовательных итераций следующего цикла находилась примерно в диапазоне от 1470000 до 1560000 нс, (~1,5 мс на итерацию ), поэтому я, вероятно, не стал бы использовать более четырех из самых правых цифр.
#/bin/bash
array=()
prev=$(date +%s%N)
for ((i=0; i < 100; i++)); do
this=$(date +%s%N)
# diff=$(( (this - prev) % 1000000000))
diff=$(( (this - prev) % 10000))
printf "$prev $this %04d\n" "$diff"
array+=("$diff")
prev=$this
done
Вместо арифметики можно просто обработать вывод date
как строку и отрезать некоторые символы. Это оставит последние 4 символа:
a=$(date +%N)
a=${a: -4}
Опять же, можно рассмотреть другие способы получения случайных чисел, например. shuf
от GNU coreutils, который не ограничивается только перетасовкой, но также может выбирать значения с повторением. Например. это напечатает 20 чисел,по 4 цифры:
shuf -i 0000-9999 -r -n 20
или с несколькими обручами, чтобы получить нулевой -отступ:
shuf -i 10000-19999 -r -n 20 |sed -e 's/^1//'
Вы можете прочитать вывод в массив с помощьюreadarray
:
readarray array < <(shuf -i 0000-9999 -r -n 20)
Неудивительно, что shuf
ужасно быстрее, чем зацикливание в оболочке по вызовам date
. Вы также можете использовать меньший диапазон, например. -i 0-9
, чтобы получить однозначные -числа.