Bash的猫,然后,让和管道导致奇怪的范围行为

时间:2010-11-21 08:34:28

标签: bash while-loop cat piping

所以这是我的剧本:

count=0
cat myfile | while read line
do
    #some stuff...
    let count++
    echo $count
done
echo $count

最后一个echo语句输出0而不是文件中的行数,尽管while循环中的echo语句打印了递增值。

问题出在管道上,因为使用简单的while循环,最后一个echo语句会输出正确的值。我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:4)

在Bash中,您可以使用进程替换并避免使用临时文件,并保留while循环中的变量。

count=0
while read -r line  # you should almost always use -r
do
    #some stuff...
    (( count++ ))   # alternative form 
    echo $count
done < <(tac myfile)
echo $count

答案 1 :(得分:2)

使用管道时,会创建一个新的子shell,其中的所有变量都会丢失。请改用以下代码:

count=0
while read line
do
    #some stuff...
    let count++
    echo $count
done < myfile
echo $count

命令示例:tac

count=0
# Create a random file
tmpfile=$(mktemp)
tac myfile > $tmpfile
while read line
do
    #some stuff...
    let count++
    echo $count
done < $tmpfile
# remove temp file
rm $tmpfile
echo $count