將 /dev/urandom 的內容放入變數中?

將 /dev/urandom 的內容放入變數中?

這是我之前的主題的後續內容:- 將日期命令傳遞給變數?

好吧,我希望 /dev/urandom 為我產生 4 位數。並將它們放入變數中。

這是我的 bash 腳本的範例:-

#!/bin/bash
for (( c=0; c<=10; c++))
do
        a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

        echo $a
done

我希望「回顯」結果的唯一原因是這樣我實際上可以看到 /dev/urandom 已正確為我產生了 4 位數字。

對於我想要製作的 bash 腳本,我需要以程式設計方式執行此操作,因為我希望對生成的結果進行進一步的操作。

所以我不需要「回顯」結果。也是如此a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

實際上將 4 個隨機數字放入變數“a”中?當我從腳本中回顯“a”時,我只是得到一個懸掛的控制台,並且必須使用“CTRL+C”來恢復我的控制台。

我想做的就是將 /dev/urandom 中的 4 個隨機數字放入變數中。

我是 bash 腳本新手,所以歡迎所有建議,並提前感謝您的任何幫助或建議。

答案1

如果你不需要安全性,你可以使用bash的內置RANDOM多變的。要獲得 0 到 9999(含)之間的隨機數,$((RANDOM % 10000))會對小於 767 的值產生較小的偏差,因為 的值$RANDOM在 [0, 32767] 範圍內是均勻的。要獲得均勻分佈,並放置前導零:

while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}

再次注意,這不適用於任何涉及安全的地方。的輸出$RANDOM是不可預測的。

如果您確實需要安全性,那麼這/dev/urandom是獲取隨機資料的正確位置。在大多數目前的 unice 上,呼叫fold是不必要的:您可以使用 . 來取得 4 個字元head -c

a=$(</dev/urandom tr -dc 0-9 | head -c 4)

head -c不是 POSIX,也不存在於 OpenBSD 上,但它存在於其他 BSD 和 Linux 上(兩者都使用 GNU coreutils 和 BusyBox)。

如果您需要移植到沒有 的系統head -c,那麼fold -w 4 | head -n 1POSIX 標準是一個很好的替代品。請注意,您確實需要調用head,否則fold將永遠保留 4 位數的輸出行。

答案2

fold只會折疊無限的數字流,因此a被無限期地定義。您將需要新增一個終止命令,最簡單head

 a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1)"

只需比較這兩個命令的行為

tr -dc '[:digit:]' < /dev/urandom | fold -w 4  
tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1

第一個將顯示無限的 4 位隨機數流,而第二個將在一行後中止。

相關內容