Bash

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

  • June 22, 2021

這是我上一個執行緒的後續內容:- 將日期命令傳遞給變數?

好的,我希望 /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 1POSIX 標準是一個很好的替代品。請注意,您確實需要head呼叫,否則fold將永遠保持輸出 4 位數的行。

引用自:https://unix.stackexchange.com/questions/655272