while循环重置Bash脚本中的数字变量

时间:2014-02-27 18:46:12

标签: bash loops while-loop

我正在尝试使用一个简单的bash脚本在一组文件夹中的每个文件中执行某些操作。另外,我喜欢计算脚本读取的文件数量,但是当脚本通过循环时,数值变量将被重置。

我正在使用的代码就是那个

#!/bin/bash
let AUX=0
find . -type "f" -name "*.mp3" | while read FILE; do
    ### DO SOMETHING with $FILE###
    let AUX=AUX+1
    echo $AUX
done
echo $AUX

我可以看到AUX在循环内部计数,但最后一个“echo”打印出0,变量似乎真的被重置了。我的控制台输出就像那样

...
$ 865
$ 866
$ 867
$ 868
$ 0

我想在AUX中保存已经过的文件数量。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

不要使用管道,它会创建一个子壳。示例如下。

#!/bin/bash
declare -i AUX=0
while IFS='' read -r -d '' file; do
    ### DO SOMETHING with $file###
    (( ++AUX ))
    echo $AUX
done < <(find . -type "f" -name "*.mp3")
echo $AUX

答案 1 :(得分:0)

如果您有bash 4.0或更高版本,请使用globstar选项代替find

shopt -s globstar
aux=0
for f in **/*.mp3; do
    # Just in case there is a directory name ending in '.mp3'
    [[ -f $f ]] || continue
    # Do something with $f
    echo "$(( ++aux ))"
done