2014-09-05 23 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