while循环只迭代一次

时间:2015-01-25 05:05:52

标签: awk while-loop grep

我正在编写一个unix脚本,它执行awk并管道到while循环。但是出于某种原因,while循环只迭代一次。有人可以指出我缺少的东西吗?

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 

“file”看起来像

cheese 2
elephant 5
tiger 16

1 个答案:

答案 0 :(得分:0)

解决方案

解决方案是替换:

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