0

这里有 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."
4

1 回答 1

5

发生这种情况是因为 while 循环之前的管道。它创建了一个子shell,因此变量中的更改不会传递给主脚本。要克服这个问题,请改用进程替换

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"
于 2013-08-16T14:28:50.700 回答