2014-09-05 89 views
0

我試圖讓隨機字符在與字符一起存儲的數組中打印出來。我是新手,一直在尋找一些指導,但遇到了一些問題。在範圍內創建隨機數並訪問arrayindex字符

我創建一個數組來測試哪些商店字符。然後我有一個名爲Range的變量,它是21(這是數組的長度)。

#create an characters to test with 
letters=(a,b,e,g,i,j,k,l,m,n,p,q,r,s,t,u,v,y,x,w,z) 

RANGE=21 

然後我嘗試從0 - >範圍內得到一個隨機數,所以它將與數組索引對應。然後我需要訪問隨機數的數組索引並將其存儲在名爲arraychar的變量中。我已經做了這樣的:

number=$RANDOM%$RANGE #gets int of a random number between 0 and range (size of array) 
arraychar=${letters[$number]} #chooses a random char from array and stores in arraychar 

然後我想這封信作爲參數傳遞給我的可執行文件,像這樣:

for i in `seq 1 3`;do 
    echo $i " " 
    ./sample-tree -$arraychar 
done 

它一直掛在這裏,我也不太清楚是什麼它在幹什麼,爲什麼它不工作。

任何幫助將不勝感激,因爲我是一個新手!

謝謝。

+1

這不是在bash中創建數組的語法。元素之間應該有空格,而不是逗號。 – Barmar 2014-09-05 02:06:20

+0

'letters =({a..z})'syntax也起作用(至少在bash 4 ..) – anishsane 2014-09-05 07:56:01

回答

2

您的文章中的代碼片段有許多錯誤。

letters=(a,b,e,g,i,j,k,l,m,n,p,q,r,s,t,u,v,y,x,w,z)是一個元素的數組。看看declare -p letters吐在你身上確認。 sh數組是空白分隔的列表。

shell中的數組長度可通過${#letters[@]}獲得。

number=$RANDOM%$RANGE沒有做你期望的。再次看看declare -p number表示變量的值是(echo "$number"也可以)。

您需要arithmetic expansion來評估模數運算(即number=$((RANDOM % RANGE)))。

其他幾對「文體」點以及:

  • 你不會在數組索引方面需要$(例如${letters[$number]}可以寫成${letters[number]})。
  • 在bash(以及許多其他shell)中,您可以使用{1..3}來獲取數字列表,而不需要子shell和seq。
  • echo $i " "中的尾隨空間對您不會有太大的幫助,因爲echo也會輸出一個換行符(除非您使用-n,但在這種情況下,您可能會用printf更好)。
+0

'declare -a letters ='([0] =「a,b,e,g,i,j ,k,l,m,n,p,q,r,s,t,u,v,y,x,w,z「)' 謝謝,我會再試一次。 – 2014-09-05 02:10:31

+0

@ user3530774對,請注意那裏的「[0]」?這是索引。看看如何只有一個?將它與'l =(a b c d);聲明-p l'。 – 2014-09-05 02:11:38

+1

@EtanReisner +1。在這裏可能不是非常重要,但是不值得一提,你不應該使用'$ RANDOM'來做任何重要的事情,尤其是因爲依賴於RANGE,甚至可能不會產生隨機數的均勻分佈(因爲'RANDOM'將會是一個介於0 ... 32767之間的僞隨機數) – BroSlow 2014-09-05 03:20:18