Передача команды даты в переменную?

common/utils.c 69 :невозможно открыть /var/lib/hp/hplip.state

создайте hplip.state, используя привилегии суперпользователя, а затем установите подключаемые модули hp, которые могут вам понадобиться для этого, на компьютере клиента/пользователя, если они не могут печатать.

0
26.05.2021, 08:57
3 ответа

Вы можете использовать синтаксис раскрытия параметра${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")
0
28.07.2021, 11:29

Мой первоначальный подход заключался в использовании обработки строк для вывода 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
2
28.07.2021, 11:29

Если вы запустите 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, чтобы получить однозначные -числа.

0
28.07.2021, 11:29

Теги

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