2011-12-31 110 views
0

我想做一个循环(for file in *)只有5次(所以它不是一个真正的循环了,但是)但是有无论如何做到这一点?做一个循环只有5次

+2

以何种方式不限制环路5迭代使其“不是真正的循环”? – 2011-12-31 22:58:49

+0

还有'seq'命令。 – fge 2012-01-01 12:50:21

回答

5

将文件放在数组中,然后对数组进行切片。

$ files=(*) 
$ for file in "${files[@]::5}" ; do echo "$file" ; done 
あいうえお 
0000000000-11-005978.txt 
0000000000-11-020832.txt 
1 
,123 
1

这只会看看目录的第一个五个品:如果

for file in $(ls | head -5) 

正如伊格纳西奥巴斯克斯 - 艾布拉姆斯点出,这仅适用于您的文件名不包含任何空格。 (他们可能不会,但事情要记住。)

+1

除非其中一个在文件名中有空格。 – 2011-12-31 22:45:29

+0

@ IgnacioVazquez-Abrams嗯,这是非常罕见的,虽然你是正确的。 – chrisaycock 2011-12-31 22:53:05

+1

@chrisaycock:文件名中的空白不是非常罕见。 '用于$(ls -1 | head -5)中的文件“;做回声“$文件”;完成'做它应该做的事情。 – Dennis 2011-12-31 23:05:51

1

假设变量i未定义或0,当你进入循环,在循环中不使用,只需添加一行:

 
test $((++i)) -ge 5 && break 

在循环体中。循环将在第5次迭代期间爆发,因此如果将该行放在循环体的末尾,那么您的命令将执行5次。如果你的外壳支持的话,你也可以使用更少的便携式

 
((++i >= 5)) && break 
0

这里是另一种解决方案,只使用bash和没有外部工具:

let COUNT=0 
for FILENAME in * 
do 
    echo do something to $FILENAME 
    let COUNT=COUNT+1 
    if (($COUNT == "5")); then 
     break 
    fi 
done