bash生成随机数,但检查文件是否已经选择了该数

bash生成随机数,但检查文件是否已经选择了该数,bash,Bash,我试图用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=/

我试图用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文件,但没有写入任何内容,而且回音是空的,没有显示其中的值。

也许我理解的问题是错误的,但您似乎只需要检查生成的数字以前是否生成过。如果没有,请将其添加到文件中。 请尝试以下操作:

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
}

将数字重定向到文件中时请注意>>。

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

#!/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是要使用的最高和最低端口号,随后还会进行检查,以确保所选范围内的所有端口均未被占用。这是通过比较从变量min和max中选择的范围(产生变量范围)和已使用的端口数来实现的


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

顺便说一句,我认为这不适合使用递归。只是使用一个while循环。这也不起作用,我添加了一些echo来查看失败的地方,但它们永远不会返回给我。问题是grep的退出代码。我更新了我的答案,不客气。顺便说一句,我同意卡顿的观点:我认为这不是递归的恰当用法。使用一段时间,我也同意,自从我第一次遇到这个问题以来,我还没有使用过。现在我知道什么地方出了问题,并且确实可以对其进行while循环。原因是我们为某些实例提供了特定范围的端口。它是一个集群,每个项目有一个节点,因此可以创建1000个项目,这很可能不会很快发生。当它出现时,我们可以很容易地说,我们将增加最大范围。