2012-01-09 42 views
0

我試圖寫形式的BASH循環:我怎樣才能不使用`seq`命令重寫這個BASH for循環?

~/$ 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

+0

出了什麼問題'seq'? – 2012-01-09 15:19:36

回答

4

你試過了嗎?

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

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

+1,但只有BASH的新版本支持。 – anubhava 2012-01-09 15:16:26

+0

這有效,我忘了那個構造。我想我真的很想知道{n..m}構造是否也符合我的要求。 – Jamie 2012-01-09 15:21:43

+0

但要小心,它是一個特定於bash的功能。就我個人而言,即使使用帶有相當新版本的bash的Linux和OS X,我也喜歡我的腳本可以在/ bin/sh中運行。 – Mithrandir 2012-01-09 15:27:18

3

根據bash的文檔

序列表達式的形式爲{x..y [.. INCR]},其中x和y是 任一整數或單個字符,INCR,一個可選的 增量,是一個整數。

在其他情況下仍然可以使用eval,但Mithrandir的建議可能會更快。

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

這回答了我想問的問題。感謝+1 – Jamie 2012-01-09 15:23:45

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 
相關問題