为循环中的变量赋值

时间:2013-08-16 14:23:28

标签: bash loops pipe

这里有2段代码,$1中的值是包含3行文本的文件名。

现在,我有一个问题。在第一段代码中,我无法从循环中获得“正确”的值,但在第二段代码中,我可以得到正确的结果。我不知道为什么。

如何让第一段代码得到正确的结果?

#!/bin/bash

count=0
cat "$1" | while read line
do
    count=$[ $count + 1 ]
done
echo "$count line(s) in all."

#-----------------------------------------

count2=0
for var in a b c
do
    count2=$[ $count2 + 1 ]
done
echo "$count2 line(s) in all."

1 个答案:

答案 0 :(得分:5)

这是因为while循环之前的管道。它创建一个子shell,因此变量中的更改不会传递给主脚本。要解决此问题,请改用process substitution

while read -r line
do
    # do some stuff
done < <( some commad)

在4.2或更高版本中,您还可以设置lastpipe选项和最后一个命令 在管道中将在当前shell中运行,而不是子shell。

shopt -s lastpipe
some command | while read -r line; do
  # do some stuff
done

在这种情况下,由于您只是使用文件的内容,因此可以使用输入重定向:

while read -r line
do
    # do some stuff
done < "$file"