我有一个处理文件夹的脚本,并同时对文件进行计数。
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