为什么$ RANDOM在shell脚本中的两个for循环中生成一个类似的值序列?

时间:2011-01-12 19:06:40

标签: unix scripting ksh

这是脚本:

#!/bin/ksh

(for k in $(seq 6); do echo $RANDOM; done) > a.txt
(for k in $(seq 6); do echo $RANDOM; done) > b.txt
echo a.txt
cat a.txt
echo b.txt
cat b.txt

输出的一个例子:

a.txt
9059
1263
29119
14797
5784
24389
b.txt
1263
29119
14797
5784
24389
26689

请注意,生成的两个数字序列重叠(即两者都包含序列1263,29119,14797,5784,24389)。

1 个答案:

答案 0 :(得分:3)

  

RANDOM 一个简单的随机数   发电机。每次RANDOM都是   引用,它被分配给下一个   随机数系列中的数字。
  关键点                 在系列中可以通过为RANDOM分配一个数字来设置(参见   兰特(3))。

这是因为你将代码包装在子shell中。当父shell调用子shell时,它只计算为$ RANDOM的一个引用,即使for循环使用它6次。当父shell调用第二个子shell时,它从随机序列中的下一个数字开始,这就是为什么你看到两个输出流一个一个。如果删除子shell,则此行为就会消失。

试试这个:

for k in $(seq 6); do echo $RANDOM; done > a.txt
for k in $(seq 6); do echo $RANDOM; done > b.txt

注意:即使使用子shell, Bash也没有这种行为。