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 循环在一次迭代后停止。我该如何继续下去?