此处使用的管道:
cat ${ITEM_LIST} | ...
之后将在子shell中执行while循环。但这意味着
NOT_FOUND
变量不会在父shell中更新,而只会在执行循环的子shell中更新。
cat ${ITEM_LIST} | {
while read item; do
grep "${item}" ${LOG_FILE} > /dev/null
FOUND=${?}
if [ ${FOUND} -ne 0 ]; then
let NOT_FOUND=NOT_FOUND+1
echo "Item not found [${item}] Item not found number: ${NOT_FOUND}"
fi
done
echo "Total items: ${TOTAL_ITEMS}"
echo "Total not found items: ${NOT_FOUND}"
}
这个问题也在一篇文章中得到了解释
Bash FAQ item
. 希望这有帮助。
如常见问题解答所述,在这种情况下,您还可以将其改写为:
while read item; do
grep "${item}" ${LOG_FILE} > /dev/null
FOUND=${?}
if [ ${FOUND} -ne 0 ]; then
let NOT_FOUND=NOT_FOUND+1
echo "Item not found [${item}] Item not found number: ${NOT_FOUND}"
fi
done < ${ITEM_LIST}
在这种情况下,首选第二个选项,因为它将消除一个“对cat的无用使用”: