如何处理递归函数内部的全局变量?

时间:2019-03-23 13:41:55

标签: bash

我正在尝试遍历目录及其子目录以提取文件。下面的代码工作正常,但是,全局变量“ DECOMPRESSED_FILES_COUNTER”仅在第一个目录内递增。 忽略“ IS_EXTRACTED”变量(这是其他用途) 这是我脚本的一小部分:

FILE_OUTPUT_HIDE=/dev/null 2>&1
DECOMPRESSED_FILES_COUNTER=0
CURRENT_PATH=$(pwd)

function extractFiles(){
    IS_EXTRACKED=""
    if ( file "$FILE_I"  | grep -w 'zip' >$FILE_OUTPUT_HIDE )
    then
        unzip -o $FILE_I >$FILE_OUTPUT_HIDE
        let "DECOMPRESSED_FILES_COUNTER++"
    elif ( file "$FILE_I"  | grep -w 'gzip' >$FILE_OUTPUT_HIDE )
    then
         gunzip -k -f -N $FILE_I >$FILE_OUTPUT_HIDE
         let "DECOMPRESSED_FILES_COUNTER++"
    elif ( file "$FILE_I"  | grep -w 'bzip2' >$FILE_OUTPUT_HIDE )
    then
        bzip2 -k -d -f  $FILE_I >$FILE_OUTPUT_HIDE
        let "DECOMPRESSED_FILES_COUNTER++"
    else
        IS_EXTRACKED=false
    fi
}

function recursiveMode(){
    for FILE_I in *; do
        if [ -d "$FILE_I" ]; then
            (cd -- "$FILE_I" && recursiveMode)
        fi
        extractFiles 
    done
}

示例:

omri @ omri-pc:/ mnt / c / users / omri / mission $ ./myScript -r newFolder

假设“ newFolder”具有3个归档文件,而其子文件夹“ otherFolder”具有2个归档文件。

我希望DECOMPRESSED_FILES_COUNTER为5,但即使提取了所有文件,实际值为3。

1 个答案:

答案 0 :(得分:1)

您用于在目录中本地化更改的子Shell导致对变量的更改仅保留在该子Shell中。使用pushdpopd来更改和还原工作目录。

function recursiveMode(){
    for FILE_I in *; do
        if [ -d "$FILE_I" ]; then
            pushd "$FILE_I"
            recursiveMode
            popd
        fi
        extractFiles 
    done
}

但是,考虑到您使用的仅bash个功能,您也可以使用另一个功能:** glob模式为您进行递归。

shopt -s globstar

counter=0
extractFile () {

    if file "$1" | grep -qw bzip2; then
       bzip2 -k -d -f "$1"
    elif file "$1" | grep -qw gzip; then
       gunzip -k -f -N "$1"
    elif file "$1" | grep -qw zip; then
       unzip -o "$1"
    else
       return        
    fi > /dev/null
    ((counter++))
}

for f in **/*; do
    extractFile "$f"
done