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

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

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


当前回答

这是一个用Python写的

randport=$(python -S -c "import random; print random.randrange(2000,63000)")

还有一个是awk

awk 'BEGIN{srand();print int(rand()*(63000-2000))+2000 }'

其他回答

如果您不是bash专家,并希望将此转换为基于linux的bash脚本中的变量,请尝试以下方法:

VAR=$(shuf -i 200-700 -n 1)

这样算上VAR,你的投资范围在200到700美元之间。

这对我来说很管用:

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

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

shuf -i 2000-65000 -n 1

享受吧!

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

根据bash手册页,$RANDOM分布在0到32767之间;也就是说,它是一个无符号的15位值。假设$RANDOM是均匀分布的,可以创建一个均匀分布的30位无符号整数,如下所示:

$(((RANDOM<<15)|RANDOM))

因为你的范围不是2的幂,一个简单的模运算几乎只能给你一个均匀的分布,但如果输入范围是30位,输出范围小于16位,就像你的例子一样,这应该足够接近了:

PORT=$(( ((RANDOM<<15)|RANDOM) % 63001 + 2000 ))

这就是我通常生成随机数的方法。然后我使用“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