繁体   English   中英

Bash - for 循环中的多个条件

[英]Bash - Multiple conditions in a for loop

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

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

我在这里做错了什么?

    #!/bin/bash

j=0

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

done

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

非常感谢

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_

您正在尝试将两种不同样式的for -loops组合为一种。 相反,如果j的值太大,就中断:

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

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

[更新:以下内容基于我对循环目的的猜测。 有关实际上下文,请参见在bash中从文件计算Word出现次数 。]

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

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

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

一个简单的嵌套for循环?

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

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

一旦我需要处理目录中的所有文件,但只处理第 n 个文件或处理完所有文件:

count=1
nth=10
for f in folder/*; do
  ((count++))
  # process $f
  if [[ $count -gt $nth ]] 
  then
    break
  fi
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM