假設
$DISTR
經過的秒數定義了當前進程ID(PID)和當前的時間/日期產生是非的路徑空的文件。
修復現有代碼
agents=($(shuf "$DISTR")) # create shuffled array
echo "${agents[0]}" # print the first entry
的第一項是一個隨機條目由於陣列混洗。
請注意,此解決方案只適用於每行包含一個單詞(無空格)的文件。如果一行包含多個單詞,每個單詞將被存儲在之後的單獨數組條目之後的行被混洗。爲了與線
...
first second
1st 2nd
...
一個文件,我們可以打印first
或1st
,但從來沒有second
或2nd
。
更好的解決方案
洗牌,整個陣列是一個大量的工作,如果你只在一個隨機進入感興趣。按照原始順序讀取數組並更快地選取一個隨機索引。
mapfile agents "$DISTR" # create array
length=${#agents[@]}
randomIndex=$((RANDOM % length)) # random number between 0 and length-1
echo "${agents[randomIndex]}"
或簡稱
mapfile agents "$DISTR"
echo "${agents[RANDOM % ${#agents[@]}]}"
RANDOM
是一個內置變量/函數返回一個僞隨機數(不加密等使用)。 mapfile
每個數組條目存儲一行,即使這些行包含空格。
最佳解決方案
我們再次做了太多的工作。爲什麼我們只能挑選一個隨機行,將整個文件讀入數組? (典型案例XY problem)。
shuf -n 1 "$DISTR" # print one random line
你的意思是「得到一個隨機數組*條目*」嗎?那麼有兩個問題。 (1)'agents'不是一個數組。使用'agents =($(shuf「$ DISTR」))'創建一個。 (2)switch case語句對數組沒有影響。您必須選擇一個隨機索引並使用該索引從數組中檢索一個元素。 – Socowi
我需要從這種情況下的隨機輸出 – Amos