У меня есть следующая строка для генерации случайного числа:
head -c 3 / dev / urandom | hexdump | sed -e 's / [0 a-z] // g' | голова -c 1
Это работает нормально, но иногда (очень редко) возвращает новую строку. Кто-нибудь знает, почему это может быть?
Короткий ответ: Ваши три случайных байта соответствуют [0a-f] + в шестнадцатеричном формате.
Длинный ответ: В hexdump
команда в вашем канале возвращает смещение адреса, за которым следует пробел и шестнадцатеричное представление трех байтов, которые вы получаете от head -c 3 /dev/urandom
. Смещение адреса в первой строке всегда "0000000", поэтому оно отбрасывается sed
фильтр, а также пространство после него. Итак, единственное, что имеет отношение к делу, sed
команда в первой строке - шестнадцатеричное представление трех urandom
байты. Но бывает (случайно ;-)), что шестнадцатеричное представление всех трех байтов будет состоять из числа 0 и символов a
через f
, только. Так что ваши sed
filter ничего не вернет для первой строки, оставив только одну новую строку. В head -c 1
в конце трубы отфильтрует следующую строку из hexdump
, так что вы ничего не увидите.
Пример с не очень случайными числами:
# First three bytes with values 4, 5 and 6 octal.
$ echo -n $'\004\005\006' | hexdump
0000000 0504 0006
0000004
# Because of little endianess, we get the 5 back after the sed and head filters
$ echo -n $'\004\005\006' | hexdump | sed -e 's/[0 a-z]//g' | head -c 1
5
# Now with FF bytes (be aware that it is octal notation),
# only 'f' and '0' and space are left:
$ echo -n $'\377\377\377' | hexdump
0000000 ffff 00ff
0000004
# Now filtering this through sed gives nothing back
$ echo -n $'\377\377\377' | hexdump | sed -e 's/[0 a-z]//g' | head -c 1
$
Вы должны использовать $RANDOM
, как написал @Iain.
Понятия не имею, почему ваша команда генерирует новую строку, но она кажется очень запутанной. Вы пробовали работать со встроенным bash $RANDOM
?
echo $(( $RANDOM % 9 ))
например.
Есть также много явно менее запутанных способов сделать это. Вот о переполнении стека.