在while循环中修改全局变量

dai*_*isy 47 bash

我有一个处理文件夹的脚本,并同时计算文件。

i=1
find tmp -type f | while read x
do 
   i=$(($i + 1))
   echo $i
done
echo $i
Run Code Online (Sandbox Code Playgroud)

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

iga*_*gal 54

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

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

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

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

i=1
for x in $(find tmp -type f);
do 
   i=$(($i + 1))
   echo $i
done
echo $i
Run Code Online (Sandbox Code Playgroud)

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

另请参阅 Advanced Bash Scripting Guide 中的以下章节:

  • 关于第一个解决方案,它不是像 `&lt; &lt;(find ...)` 那样进行过程替换,而不是像 `&lt;&lt;&lt;(fi​​nd ...)` .... 你的是后者,这似乎不正确。 (2认同)
  • `&lt;&lt;&lt;$(` 的一个简单版本是 `&lt; &lt;(`。使用此处的文档会导致问题。例如,它们会忽略 NULL 字节,就像使用命令 `find … -print0` 时一样。 (2认同)

小智 8

#!/bin/bash
i=1
while read x
do
   i=$((i+1))
   echo $i
done < <(find . -type f)
echo $i
Run Code Online (Sandbox Code Playgroud)

/sf/ask/517334821/