我正在编写一个 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
最佳答案
解决方案
解决方案是更换:
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
关于awk - while 循环只迭代一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28133426/