BASH:迭代for循环中的数字范围

时间:2014-10-08 14:53:25

标签: bash shell variables for-loop tail

我想从单词列表中创建一个数组。所以,我正在使用这段代码:

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

的值

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

您的范围不会按照您的想法进行评估,例如:

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

你最好只使用for循环:

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

答案 1 :(得分:1)

它失败了,因为你不能在shell中使用范围指令中的变量,即{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

另请注意,从命令中删除无用的cat

答案 2 :(得分:1)

只是要详细说明以前的答案,这是因为“支持扩展”。是bash解析的第一部分,永远不会重复:当大括号扩展时,&#39; $ count&#39;只是一段文字,所以大括号保持不变。然后,当&#39; $ count&#39;扩展到一个数字,大括号扩展永远不会再次运行。请参阅here

如果您因某种原因想要再次强制进行大括号扩展,您可以使用&#39; eval&#39;:

{1..$count}替换为$(eval echo {1..${count}})

更好的是,在你的情况下,像anubhava所做的那样。

答案 3 :(得分:1)

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

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