我需要从一个shell脚本生成一个2000-65000之间的随机端口号。问题是$RANDOM是一个15位的数字,所以我被卡住了!

如果没有大小限制,PORT=$(($RANDOM%63000+2001))将很好地工作。

有没有人有一个例子,我可以这样做,也许从/dev/urandom提取一些东西,并得到它在一个范围内?


当前回答

shuf -i 2000-65000 -n 1

享受吧!

编辑:范围是包括在内的。

其他回答

ruby也是一样:

echo $(ruby -e 'puts rand(20..65)') #=> 65 (inclusive ending)
echo $(ruby -e 'puts rand(20...65)') #=> 37 (exclusive ending)

生成范围为[$floor,$ceil]的随机数,不依赖:

$(((RANDOM % $(($ceil- $floor))) + $floor))

在2000到65000之间生成100个数字:

for i in $(seq 100); do echo $(((RANDOM % $((65000 - 2000))) + 2000));done

我能想到的最简单的方法是perl一行代码:

perl -e 'print int(rand(65000-2000)) + 2000'

你可以用两个数字:

PORT=$(($RANDOM + ($RANDOM % 2) * 32768))

你还是得在你的范围内。这不是一般的n位随机数方法,但它适用于您的情况,并且都在bash中。

如果你想非常可爱地阅读/dev/urandom,你可以这样做:

od -A n -N 2 -t u2 /dev/urandom

它会读取两个字节,并将它们作为unsigned int输出;你还是得剪。

在Bash中从10000000000 -999999999999范围内生成50个数字,并将它们保存到文件filename.csv中

shuf -i 100000000000-999999999999 -n 50 -o filename.csv

这就是我通常生成随机数的方法。然后我使用“NUM_1”作为我使用的端口号的变量。下面是一个简短的示例脚本。

#!/bin/bash

clear
echo 'Choose how many digits you want for port# (1-5)'
read PORT

NUM_1="$(tr -dc '0-9' </dev/urandom | head -c $PORT)"

echo "$NUM_1"

if [ "$PORT" -gt "5" ]
then
clear
echo -e "\x1b[31m Choose a number between 1 and 5! \x1b[0m"
sleep 3
clear
exit 0
fi