1

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

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

我在这里做错了什么?

    #!/bin/bash

j=0

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

done

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

非常感谢

4

4 回答 4

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

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

[ $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_
于 2012-08-07T16:25:32.000 回答
5

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

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

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

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

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

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

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

于 2012-08-07T16:33:10.570 回答
0

一个简单的嵌套for循环?

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

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

于 2012-08-07T17:40:59.170 回答
0

一旦我需要处理目录中的所有文件,但仅在第 n 个文件或所有文件被处理之前:

count=1
nth=10
for f in folder/*; do
  ((count++))
  # process $f
  if [[ $count -gt $nth ]] 
  then
    break
  fi
done
于 2021-12-22T04:21:51.857 回答