我想从单词列表中创建一个数组。所以,我正在使用这段代码:
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 $i
,tail -n $(i)
,但无法传递i
有什么想法吗?
答案 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)