Bash - for循环中的多个条件

Epi*_*Epi 1 linux bash shell loops

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

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

我在这做错了什么?

    #!/bin/bash

j=0

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

done
Run Code Online (Sandbox Code Playgroud)

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

非常感谢

Igo*_*bin 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
Run Code Online (Sandbox Code Playgroud)

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

[ $j -gt 20 ] && break
Run Code Online (Sandbox Code Playgroud)

另一种解决方案,不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_
Run Code Online (Sandbox Code Playgroud)


che*_*ner 5

您正在尝试将两种不同样式的for-loops组合成一种.相反,只要价值j变得过大就会中断:

j=0
while read -r line; do
    [[ j >= 20 ]] && break
    ...
done < ._temp
Run Code Online (Sandbox Code Playgroud)

(顺便说一下,这是在bash中迭代文件的首选方法.for如果文件太大,使用-loop会遇到问题,因为您实际上是使用文件的全部内容构建命令行.)

[更新:以下是基于我对循环目的的猜想.请参阅在bash中从文件计算单词出现次数以获取真实上下文.

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

sort -u .temp_ | grep -f $dictionary -Fx -v -m 20 >> $dictionary
Run Code Online (Sandbox Code Playgroud)

这只会调用grep一次,而不是每行调用一次.temp_.