如何重写这个BASH for循环而不使用`seq`命令?

时间:2012-01-09 15:04:01

标签: bash

我试图写一个形式的BASH循环:

~/$ for i in {1..$(grep -c "match" file)} ; do echo $i ; done
{1..20}

我希望它会产生计数输出。所以我尝试了这个:

~/$ export LOOP_COUNT=$(grep -c "match" file)
~/$ for i in {1..$LOOP_COUNT} ; do echo $i ; done
{1..20}

我重新使用的是:

~/$ for i in $(seq 1 1 $(grep -c "match" file)) ; do echo $i ; done
1
2
3
...
20

完美! 但是如何在不使用 seq的情况下获得该行为?

3 个答案:

答案 0 :(得分:4)

你试过这个吗?

max=$(grep -c "match" file)

for (( c=1; c <= $max; c++ ))
do
    echo $c
done

答案 1 :(得分:3)

根据bash文档

  

序列表达式采用{x..y [.. incr]}的形式,其中x和y是   整数或单个字符,incr,可选   增量,是一个整数。

在其他情况下你仍然可以使用eval,但Mithrandir的建议可能更快。

eval "for i in {1..$(grep -c 'match' file)} ; do echo \$i ; done"

答案 2 :(得分:0)

这是一个递归解决方案:

loop () {
    i=$1
    n=$2 
    echo $i
    ((i < n)) && loop $((i+1)) $n
}

LOOP_COUNT=$(grep -c "Int" sum.scala)

loop 1 $LOOP_COUNT