在腳本編寫與自動化運維中,隨機數常用於生成臨時檔名、測試資料、負載均衡權重等場景。Linux 系統提供了多種獲取隨機數的途徑,本文將從時間戳、內建變數、核心熵池三個維度,介紹 Shell 下實用的隨機數生成技巧。
date 指令獲取高精度時間戳date 指令的格式化輸出能提供秒級(%s)與奈秒級(%N)時間戳,組合使用可獲得極高精度的「偽隨機數」。
# 秒級時間戳(自 1970-01-01 起的秒數)
date +%s
# 1287764773
# 當前秒的奈秒部分(0~999,999,999)
date +%N
# 738710457
# 組合:秒級 + 奈秒,精度極高,同一奈秒內幾乎不會重複
date +%s%N
# 1287764807051101270
#!/bin/bash
# 用法:random_min_max min max
function random() {
local min=$1
local max=$2
local range=$((max - min + 1))
local num=$(date +%s%N)
echo $((num % range + min))
}
# 測試:生成 10 個 2~10000 之間的隨機整數
for i in {1..10}; do
echo "$i: $(random 2 10000)"
done
優點:通用性強,不依賴特定 Shell;缺點:極高併發下理論上仍有碰撞可能,且需啟動外部程序,效率稍低。
$RANDOMBash、Zsh 等現代 Shell 內建了 $RANDOM 變數,每次引用返回 0~32767 之間的整數(15 位隨機位)。
echo $RANDOM # 例:10918
echo $RANDOM # 例:10001
# 生成 0~99999999 的隨機數
echo $((RANDOM * 32768 + RANDOM))
# 或結合取模運算
echo $((RANDOM % 100000))
優點:極快、無需外部程序;缺點:熵來源較弱,不適合加密用途,且最大值受限於 15 位。
/dev/urandom 或 /dev/randomLinux 核心收集硬體中斷、滑鼠鍵盤事件等熵源,透過 /dev/urandom(非阻塞)或 /dev/random(阻塞)提供高品質隨機位元流。
# 讀取 4 位元組,轉為無號整數(0~4294967295)
od -An -N4 -tu4 /dev/urandom | tr -d ' '
# 生成指定範圍整數(例:100~999)
awk -v min=100 -v max=999 'BEGIN{srand(); print int(min+rand()*(max-min+1))}' /dev/urandom
# 直接用 bash 內建讀取(需 bash 5.1+)
read -r -n4 bytes < /dev/urandom
printf '%d\n' "'$bytes"
優點:密碼學級隨機性,適合生成金鑰、Token;缺點:讀取較慢,腳本較複雜。
uuidgen 生成 UUID 並轉換# 生成標準 UUID
uuidgen
# 550e8400-e29b-41d4-a716-446655440000
# 取前 8 位十六進位轉十進位
printf '%d\n' 0x$(uuidgen | cut -d- -f1)
$RANDOM 或 date +%s%N,簡單高效。$RANDOM 或讀取 /dev/urandom 配合 awk/bash 運算。/dev/urandom 或專用工具(openssl rand、gpg --gen-random)。Linux Shell 提供了從簡單到專業的多層次隨機數獲取方式。理解各方法的熵來源、效能與適用場景,能讓腳本更健壯、更安全。日常運維中,$RANDOM 與 date +%s%N 已足應付 90% 以上需求;涉及安全時,請毫不猶豫地轉向 /dev/urandom 或 OpenSSL。