【问题标题】:BASH: Iterate range of numbers in a for cicleBASH:在for循环中迭代数字范围
【发布时间】:2014-12-03 07:06:27
【问题描述】:

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

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的值传递给尾部

有什么想法吗?

【问题讨论】:

  • 您在哪里设置$count 的值?祝你好运。
  • 你可以说for i in $(seq $count)

标签: bash shell variables for-loop tail


【解决方案1】:

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

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

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

最好只使用 for 循环:

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

【讨论】:

    【解决方案3】:

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

    如果您出于某种原因想要强制再次发生这种大括号扩展,您可以使用 'eval':

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

    在你的情况下,最好按照 anubhava 的建议去做。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 虽然它只是隐含在问题中,但我认为意图是...... sort -ur | head -n $count 只获得 $count 值。但谁知道呢?无论如何,+1。
      猜你喜欢
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 2017-03-20
      • 2019-10-08
      • 2014-08-08
      • 1970-01-01
      相关资源
      最近更新 更多