【问题标题】:bash generate random number, but checking file if the number has already been chosenbash 生成随机数,但检查文件是否已经选择了该数字
【发布时间】:2017-05-08 11:57:26
【问题描述】:

我正在尝试使用 bash 生成一个随机数,但它必须是唯一的。所以我想将生成的数字保存在一个文件中,每次生成一个数字时都必须抓取文件并检查该数字是否已经生成。

这是我必须生成的数字:

function _generateNumber
{
   echo -e "\e[32m Setting node port\e[0m"

   NUM=$(shuf -i 3000-3999 -n 1)

   echo -e "\e[32m Generated: ${NUM} \e[0m"
   portsDir=/inc/ports.txt

   if grep -Fxq "$portsDir"
   then
       echo -e "\e[32m I found the directory \e[0m"
       if [ -f "$portsDir" ]
       then
           echo -e "\e[32m I have not found the code yet \e[0m"
           echo "$NUM" > "$portsDir"
       fi
       echo $NUM
   else
       echo -e "\e[32m I have found the code, generate a new one \e[0m"
       _generateNumber
   fi
}

node_port=$(_generateNumber)

我创建了 /inc/ports.txt 文件,但没有写入任何内容,而且 echo 为空且未显示其中的值。

【问题讨论】:

  • 顺便说一句,我不认为这是对递归的适当使用。只需使用一个while循环。

标签: bash


【解决方案1】:

可能是我理解错了,不过好像你只需要检查生成的数字之前是否生成过。如果没有,请将其添加到文件中。
请尝试以下操作:

function _generateNumber
{
  NUM=$(shuf -i 3000-3999 -n 1)
  portsDir=/inc/ports.txt

  found=`grep -cx $NUM $portsDir`
  if [ $found -eq 0 ]; then
    echo $NUM >> $portsDir
    echo $NUM
  else
    _generateNumber
  fi
}

将号码重定向到文件时请注意>>

【讨论】:

  • 这也不起作用,我添加了一些回显来查看它失败的地方,但它们永远不会回显给我。
  • 问题出在 grep 的退出代码中。我更新了我的答案。
  • 不客气。顺便说一句,我同意 ccarton 的观点:“我认为这不是对递归的适当使用。只需使用 while 循环”
  • 我也同意,自从我第一次遇到这个问题以来还没有它。现在我知道出了什么问题,并且确实可以对其进行 while 循环。
【解决方案2】:

我使用这种方法将照片添加到随机幻灯片中,并在其中生成随机数来提供幻灯片中的位置。我需要确保为新照片生成的随机数以前没有被使用过。这是我的解决方案:

#!/bin/bash
PortsFile=/inc/ports.txt
min=1;max=5 # Port range. Change these to 3000 and 3999 respectively
create_random () {
        num=$(($min + RANDOM % $max))
}
range=$(($max - $min));((range++));used=$(wc -l < $PortsFile) # Get range and used ports
[[ $used -eq $range ]] && { echo "All available ports used. Aborting.";exit 0; }
while true; do create_random
[[ $(grep $num $PortsFile) ]] || { echo $num>>$PortsFile; break; }; done

变量 min 和 max 是您要使用的最高和最低端口号,随后还会进行检查以确保所选范围内的所有端口尚未被占用。这是通过比较从变量minmax(产生变量range)和已经使用的端口数(变量used)中选择的范围来完成的。

注意:如果您打算将其用于 1000 个端口,并且使用了其中的 999 个,那么运行循环显然会有相当大的延迟,其中需要一个随机数来匹配唯一的可用的空闲端口号。这对于 10 个端口是可以的,因为延迟是可以接受的,但对于 1000 个端口可能不是这样。为什么不使用顺序端口号呢?

【讨论】:

  • 原因是我们为某些实例提供了特定范围的端口。这是一个集群,每个项目我们有 1 个节点,因此可以创建 1000 个项目,这可能不会很快发生。当它发生时,我们可以轻松地说我们会增加最大范围。
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 2022-01-24
  • 1970-01-01
  • 2022-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多