为什么这个 bash 命令有时会返回一个空字符串?

为什么这个 bash 命令有时会返回一个空字符串?

我有以下一行来生成随机数:

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 上。

相关内容