在while循环中修改全局变量

在while循环中修改全局变量

我有一个处理文件夹的脚本,并同时对文件进行计数。

i=1
find tmp -type f | while read x
do 
   i=$(($i + 1))
   echo $i
done
echo $i

然而,$i总是如此1,我该如何解决这个问题?

答案1

在您的示例中,while 循环是在子 shell 中执行的,因此对 while 循环内的变量的更改不会影响外部变量。这是因为您将循环与管道一起使用,这会自动导致它在子 shell 中运行。

这是使用 while 循环的替代解决方案:

i=1
while read x; do
   i=$(($i + 1))
   echo $i
done <<<$(find tmp -type f)
echo $i

这是使用 for 循环的相同方法:

i=1
for x in $(find tmp -type f);
do 
   i=$(($i + 1))
   echo $i
done
echo $i

有关更多信息,请参阅以下帖子:

另请参阅《高级 Bash 脚本指南》中的以下章节:

答案2

i=1
while read x
do
   i=$(($i + 1))
   echo $i
done < <(find tmp -type f)
echo $i

https://stackoverflow.com/questions/7390497/bash-propagate-value-of-variable-to-outside-of-the-loop

相关内容