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

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

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


当前回答

这是另一个。我原以为它对任何东西都适用,但我工作时的centos盒子上没有sort的随机选项。

 seq 2000 65000 | sort -R | head -n 1

其他回答

PORT=$(($RANDOM%63000+2001))接近你想要的,我认为。

PORT=$(($RANDOM$RANDOM$RANDOM%63000+2001))绕过了困扰您的大小限制。由于bash不区分数字变量和字符串变量,因此这工作得非常好。“数字”$RANDOM可以像字符串一样连接,然后在计算中用作数字。神奇的!

我能想到的最简单的方法是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输出;你还是得剪。

shuf -i 2000-65000 -n 1

享受吧!

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

这对我来说很管用:

export CUDA_VISIBLE_DEVICES=$((( RANDOM % 8 )))

如果你想让它从1开始而不是0,你可以加1。

这是另一个。我原以为它对任何东西都适用,但我工作时的centos盒子上没有sort的随机选项。

 seq 2000 65000 | sort -R | head -n 1