while 循环只迭代一次

Posted

技术标签:

【中文标题】while 循环只迭代一次【英文标题】:while loop only iterates once 【发布时间】:2015-03-23 21:08:00 【问题描述】:

我正在编写一个执行 awk 并通过管道连接到 while 循环的 unix 脚本。但是,由于某种原因,。有人能指出我缺少什么吗?

awk ' print $1, $2' file | 
while IFS=" " read A B
do 
echo $B
if [ "$B" -eq "16" ];
then 
  grep -A 1 $A $1 | python unreverse.py  
else
  grep -A 1 $A
fi
done 

“文件”看起来像

cheese 2
elephant 5
tiger 16

【问题讨论】:

我很确定所有这些都可以在一个awk 中完成,不需要额外的bash 循环。您能否列出所有文件及其包含的内容,以及您希望从中获得什么。 【参考方案1】:

解决方案

解决办法是替换:

grep -A 1 $A

与:

grep -A 1 "$A" filename

filename 是您打算从grep 读取的任何文件。只是猜测,也许你打算:

grep -A 1 "$A" "$1"

我添加了双引号以防止任何可能的分词。

说明

问题在于,如果没有文件名,grep 命令会读取并使用所有标准输入。它在循环的第一次运行时执行此操作。因此,第二次运行没有输入,read A B 失败,循环终止。

一个更简单的例子

我们可以看到同样的问题发生在更少的语句中。这是一个 while 循环,它有两行输入,但只循环一次:

$  echo 1; echo 2;  | while read n; do grep "$n"; echo "n=$n"; done
n=1

在这里,只需在grep 语句中添加一个文件名,我们就会看到while 循环执行了两次,正如它应该执行的那样:

$  echo 1; echo 2;  | while read n; do grep "$n" /dev/null; echo "n=$n"; done
n=1
n=2

【讨论】:

以上是关于while 循环只迭代一次的主要内容,如果未能解决你的问题,请参考以下文章

我的 do while 循环在一次迭代后停止。我该如何继续下去?

python为啥for循环只查到一次数据

嵌套的while循环在第一次迭代PHP后停止

如何使我的程序每给定时间只迭代一次(如1s)?

如何在C中创建连续循环,其中循环的每次迭代在其内部循环的每次迭代中发生一次

python3 webscraping-循环只返回一次迭代