2014-10-08 89 views
1

我想从单词列表中创建一个数组。所以,我使用此代码:BASH:在cicle中迭代数字范围

for i in {1..$count} 
do 
array[$i]=$(cat file.txt | cut -d',' -f3 | sort -r | uniq | tail -n ${i}) 
done 

,但它没有...在tail -n ${i}

我已经尝试过tail -n $itail -n $(i)但不能通过尾i

任何想法的价值?

+0

你在哪里设置'$ count'价值?祝你好运。 – shellter 2014-10-08 15:00:52

+1

你可以说'因为我在$(seq $ count)'中。 – fedorqui 2014-10-08 15:17:23

回答

1

,因为你不能用一个变量,它失败在范围指令在外壳即{1..10}是好的,但{1..$n}不是。

在使用bash,那么你可以使用((...))运营商:

for ((i=1; i<=count; i++)); do 
    array[$i]=$(cut -d',' -f3 file.txt | sort -r | uniq | tail -n $i) 
done 

还要注意去除从您的命令无用的使用猫的。

+0

如果我替换为​​脚本失败! – znaya 2014-10-08 15:51:09

+0

更好地显示完整的命令行,以便我可以帮助更好。 – anubhava 2014-10-08 15:52:01

+0

我想我解决了它......我正在做并且不起作用。试过似乎工作正常。非常感谢! – znaya 2014-10-08 15:57:50

1

你的范围不计算你所想,如:

$ x=10 
$ echo {1..$x} 
{1..10} 

你最好只使用一个for循环:

for ((i = 1; i <= count; i++)) 
do 
    # ... 
done 
+0

感谢您的帮助!它工作得很好。 – znaya 2014-10-08 15:05:17

1

只是为了详细说明以前的答案,这是因为'大括号扩展'是bash解析的第一部分,并且从不重复:当大括号扩展时,'$ count'只是一段文本,所以支架保持原样。然后,当'$ count'扩展为一个数字时,大括号扩展将不再运行。请参阅here

如果你想出于某种原因,迫使这个括号扩展再次发生,你可以使用“EVAL”:

更换{1..$count}$(eval echo {1..${count}})

更好,你的情况,来做为anubhava建议。

1

而不是读取文件多次,使用built-in mapfile command

mapfile -t array < <(cut -d, -f3 file.txt | sort -r | uniq) 
+0

尽管这只是隐含在问题中,我认为其意图是...'sort -ur |头-n $ count'只获得'$ count'的值。但是谁知道?无论如何,+1。 – rici 2014-10-08 16:16:07