2017-04-04 51 views
0

我試圖讓隨機排列在bash 我用下面的代碼:如何獲得隨機序列從案例

agents=$(shuf $DISTR) 
    case $DISTR in 
     "1") 
      echo "amos" 
    ;; 
     "2") 
      echo "dia" 
    ;; 
     "3") 
      echo "dia lagi" 
    ;; 
esac 

echo "$agents" 

但我收到空白結果。 任何人都可以幫助我嗎?

我想輸出的情況下

+1

你的意思是「得到一個隨機數組*條目*」嗎?那麼有兩個問題。 (1)'agents'不是一個數組。使用'agents =($(shuf「$ DISTR」))'創建一個。 (2)switch case語句對數組沒有影響。您必須選擇一個隨機索引並使用該索引從數組中檢索一個元素。 – Socowi

+0

我需要從這種情況下的隨機輸出 – Amos

回答

0

假設

$DISTR經過的秒數定義了當前進程ID(PID)和當前的時間/日期產生是非的路徑空的文件。

修復現有代碼

agents=($(shuf "$DISTR")) # create shuffled array 
echo "${agents[0]}"  # print the first entry 

的第一項是一個隨機條目由於陣列混洗。

請注意,此解決方案只適用於每行包含一個單詞(無空格)的文件。如果一行包含多個單詞,每個單詞將被存儲在之後的單獨數組條目之後的行被混洗。爲了與線

... 
first second 
1st 2nd 
... 

一個文件,我們可以打印first1st,但從來沒有second2nd

更好的解決方案

洗牌,整個陣列是一個大量的工作,如果你只在一個隨機進入感興趣。按照原始順序讀取數組並更快地選取一個隨機索引。

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 
+0

謝謝。最好的解決方案是爲我工作 – Amos

0

要生成使用bash隨機數使用$ RANDOM內部猛砸功能之一。請注意,$ RANDOM不應該用於生成加密密鑰。 $ RANDOM是通過使用如由自1970年以來

$(((RANDOM % 10) + 3)) 
+0

你能解決它嗎?我需要這段代碼的隨機結果。謝謝 – Amos