3

所以这是我的脚本:

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

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

问题出在管道上,因为通过一个简单的 while 循环,最后一个 echo 语句会打印出正确的值。我怎样才能让它工作?

4

2 回答 2

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
于 2010-11-21T10:49:36.837 回答
2

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

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
于 2010-11-21T08:58:17.703 回答