Bash - for循环中的多个条件

时间:2012-08-07 16:23:52

标签: linux bash shell loops

我正在尝试使用多个条件执行for循环,但我没有找到有关如何在网络上执行此操作的任何信息

我很抱歉这些愚蠢的问题,但我刚开始用linux编程

我在这里做错了什么?

    #!/bin/bash

j=0

for line in `cat .temp_` || j in `seq 0 19`
do
    ...

done

错误说错误的语法,我不能使用||

非常感谢

3 个答案:

答案 0 :(得分:7)

for line in `cat .temp_`
do
    if ! grep -Fxq $line $dictionary && [ $j -lt 20 ]
    then
        echo $line >> $dictionary
        j=$((j+1))
    fi
    [ $j -gt 20 ] && break
done

您无法检查shell中for循环中的条件。你必须在额外的声明中这样做。 在这种情况下:

[ $j -gt 20 ] && break

另一种解决方案,没有break

while read line && [ $j -lt 20 ]
do
    if ! grep -Fxq $line $dictionary && [ $j -lt 20 ]
    then
        echo $line >> $dictionary
        j=$((j+1))
    fi
done < .temp_

答案 1 :(得分:5)

您正尝试将两种不同风格的for - 循环合并为一种。相反,如果j的值变得太大,就断开:

j=0
while read -r line; do
    [[ j >= 20 ]] && break
    ...
done < ._temp

(顺便说一句,这是在bash中迭代文件的首选方法。如果文件太大,使用for - 循环会遇到问题,因为您实际上是使用文件的全部内容。)

[更新:以下是基于我对循环目的的推测。有关真实背景,请参阅Calculate Word occurrences from file in bash。]

实际上,你可以省去循环。你正在寻找.temp_中最多20行,这些行还没有出现在名字在字典中的文件中,对吗?

sort -u .temp_ | grep -f $dictionary -Fx -v -m 20 >> $dictionary

这会在grep中每行拨打.temp_一次而不是一次。

答案 2 :(得分:0)

一个简单的嵌套for循环?

for line in `cat file`; do for j in {0..19}; do
     your_commands
done; done

如果我理解正确(你想在每一行上运行20次命令)。