While循环重置Bash脚本中的数字变量[重复]

Posted

技术标签:

【中文标题】While循环重置Bash脚本中的数字变量[重复]【英文标题】:While loop resets a numeric variable in a Bash script [duplicate] 【发布时间】:2014-02-27 18:46:12 【问题描述】:

我正在尝试做一个简单的 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 中保留已处理的文件数。有什么想法吗?

【问题讨论】:

这是 BashFAQ #24:mywiki.wooledge.org/BashFAQ/024 ...此外,作为与最佳实践相关的一项措施,对于既不导出到环境也不导出到 shell 内置的变量名使用小写字母会更安全;这样你就不会发生命名冲突。 【参考方案1】:

不要使用管道,它会创建一个子外壳。下面的例子。

#!/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

【讨论】:

如果你想展示最佳实践,我建议find ... -print0while IFS='' read -r -d '' file;这样,代码可以正确处理包含换行符和反斜杠转义序列的名称(read 没有 -r 将被解释)。 ...虽然它是无害的,只要AUX 是一个数字,一般来说,echo $AUX 是个坏主意——例如,如果AUX=* 会列出文件在当前目录中。最好echo "$AUX"【参考方案2】:

如果您有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

【讨论】:

以上是关于While循环重置Bash脚本中的数字变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在bash'while read'循环中设置的变量在它之后未设置[重复]

如何使用定时全局变量影响 bash while 循环?

Linux基础之bash脚本进阶篇-循环语句(for,while,until)及其特殊用法

Bash脚本,while循环中的多个条件

shelll脚本 for while until 循环

在bash中创建一个循环脚本,其中2个变量递增,第二个变量根据第一个变量[重复]