【问题标题】:Why am I getting the same value for echo $RANDOM for all iterations in bash?为什么我在 bash 中的所有迭代中得到相同的 echo $RANDOM 值?
【发布时间】:2017-08-29 04:29:57
【问题描述】:

bash 脚本:

for c in $( seq 1 10) 
do
   echo "random value #$c:$(echo "$RANDOM")" 
done

输出:

随机值 #1:20892 随机值 #2:20892 随机值 #3:20892 随机值 #4:20892 随机值 #5:20892 随机值 #6:20892 随机值 #7:20892 随机值 #8:20892 随机值 #9:20892 随机值 #10:20892

【问题讨论】:

  • 究竟是如何调用脚本的?换句话说,您用来运行脚本的命令行是什么?
  • 我只能用 bash 4.3.8 以这种方式重现这个:for c in $( seq 1 10) ; do echo "random value #$c:$(RANDOM=42; echo "$RANDOM")" ; done
  • 我认为这是我使用的一些旧版本的 bash。我不能在 for 循环中使用 {1..10} 因此不得不求助于 seq。虽然,我现在没有得到错误(得到不同的随机值)。我不确定发生了什么变化。无论如何,它现在有效。这才是最重要的。谢谢!

标签: bash loops random


【解决方案1】:

除非您使用的是旧版本的 bash,否则绝对没有理由求助于 seq 来生成您的序列。

此外,像echo $(echo something) 这样的东西完全是不必要的。

针对这两个问题更改脚本:

for c in {1..10} ; do
   echo "random value #$c:$RANDOM"
done

为您提供生成正确数据的内容:

random value #1:3394
random value #2:6099
random value #3:21492
random value #4:17973
random value #5:22698
random value #6:15844
random value #7:28506
random value #8:1960
random value #9:23593
random value #10:17412

而且,事实上,您的 原始 脚本也可以工作(至少在 bash 4.3.46 中),所以我猜您可能无意中在某处填充了 RANDOM 变量。您应该知道,取消设置该“变量”可能会导致以后使用它时出现问题,并将其设置为特定值会为生成器提供种子。

因此,我会在您的 bash per-shell 启动脚本中寻找可能将 RANDOM 设置为特定值的内容。由于$(echo $RANDOM) 的原因,所述脚本将被执行,如果您直接回显该值,则可能会被修复。

根据以下演示,这肯定会导致您的问题:

for c in {1..5} ; do
    RANDOM=7
    echo "random value #$c:$RANDOM"
done

给出:

random value #1:19345
random value #2:19345
random value #3:19345
random value #4:19345
random value #5:19345

【讨论】:

  • 我认为这是我使用的一些旧版本的 bash。我无法在 for 循环中使用 {1..10},因此不得不求助于 seq。
  • @amar,对于这样的小序列,您可以使用for i in 1 2 3 4 5 ; do ...
猜你喜欢
  • 2012-05-19
  • 2019-02-02
  • 1970-01-01
  • 2015-07-11
  • 2017-07-26
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 2023-01-27
相关资源
最近更新 更多