[英]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.