我需要从一个shell脚本生成一个2000-65000之间的随机端口号。问题是$RANDOM是一个15位的数字,所以我被卡住了!
如果没有大小限制,PORT=$(($RANDOM%63000+2001))将很好地工作。
有没有人有一个例子,我可以这样做,也许从/dev/urandom提取一些东西,并得到它在一个范围内?
我需要从一个shell脚本生成一个2000-65000之间的随机端口号。问题是$RANDOM是一个15位的数字,所以我被卡住了!
如果没有大小限制,PORT=$(($RANDOM%63000+2001))将很好地工作。
有没有人有一个例子,我可以这样做,也许从/dev/urandom提取一些东西,并得到它在一个范围内?
当前回答
PORT=$(($RANDOM%63000+2001))接近你想要的,我认为。
PORT=$(($RANDOM$RANDOM$RANDOM%63000+2001))绕过了困扰您的大小限制。由于bash不区分数字变量和字符串变量,因此这工作得非常好。“数字”$RANDOM可以像字符串一样连接,然后在计算中用作数字。神奇的!
其他回答
这对我来说很管用:
export CUDA_VISIBLE_DEVICES=$((( RANDOM % 8 )))
如果你想让它从1开始而不是0,你可以加1。
ruby也是一样:
echo $(ruby -e 'puts rand(20..65)') #=> 65 (inclusive ending)
echo $(ruby -e 'puts rand(20...65)') #=> 37 (exclusive ending)
这就是我通常生成随机数的方法。然后我使用“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
在Mac OS X和FreeBSD上,你也可以使用jot:
jot -r 1 2000 65000
你可以通过urandom得到随机数
Head -200 /dev/urandom | cksum
输出:
3310670062 52870
检索上述数字的一部分。
Head -200 /dev/urandom | cksum | cut -f1 -d " "
那么输出是
3310670062
为了满足您的要求,
Head -200 /dev/urandom |cksum | cut -f1 -d " " | awk '{print $1%63000+2001}'