我有以下一行来生成随机数:
head -c 3 /dev/urandom | 十六进制转储 | sed -e 's/[0 az]//g' | head -c 1
运行正常,但有时(很少)会返回新行。有人知道这是为什么吗?
答案1
简短回答:您的三个随机字节与十六进制中的 [0a-f]+ 匹配。
长答案:管道中的命令hexdump
返回一个地址偏移量,后跟一个空格和从 接收到的三个字节的十六进制表示head -c 3 /dev/urandom
。第一行中的地址偏移量始终为“0000000”,因此sed
过滤器会丢弃它以及它后面的空格。因此,sed
第一行中输入给命令的唯一相关内容是三个urandom
字节的十六进制表示。但会发生(随机 ;-))所有三个字节的十六进制表示只由数字 0 和a
到 的字符组成f
。因此,sed
过滤器将不会返回第一行的任何内容,只留下一个换行符。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 所写。
答案2
我不知道为什么你的命令会生成一个新行,但它看起来很复杂。你试过使用 bash 内置命令$RANDOM
吗?
echo $(( $RANDOM % 9 ))
例如。
还有很多看似不那么复杂的方法可以做到这一点这里在 Stack Overflow 上。