將 /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 腳本的新手,因此歡迎所有建議,並提前感謝您的任何幫助或建議。
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 位隨機數流,而第二個將在一行後中止。
如果不需要安全性,可以使用 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 1
POSIX 標準是一個很好的替代品。請注意,您確實需要head
呼叫,否則fold
將永遠保持輸出 4 位數的行。