Shell函数在放入另一个函数内部时向元素添加元素不起作用

时间:2013-11-01 16:56:12

标签: bash shell ksh

我在KSH 88中编写了一个简单的数组并执行了以下操作:

#   Vector  methods
set -A ZeroFilesArr
GlobalIndex=-1

#   Add element at the end
function ZeroFilesArr.push_back {
    let GlobalIndex=$(($GlobalIndex + 1))
    ZeroFilesArr[$GlobalIndex]=$1
    return
}

#   Return size
function ZeroFilesArr.size {
    echo ${#ZeroFilesArr[@]}
}

#   Clear content
function ZeroFilesArr.clear {
    set -A ZeroFilesArr
    let GlobalIndex=$((-1))
}

#   Print contents in format
#   Var1    \t  Var2    \t  ... \t  Var_n
function ZeroFilesArr.print {
    local tempString
    for i in ${ZeroFilesArr[@]}
    do
        tempString="$tempString $i \t "
    done
    echo $tempString
}

之后我使用以下方法进行了测试:

ZeroFilesArr.push_back File1
ZeroFilesArr.push_back File2
ZeroFilesArr.push_back File3
echo $(ZeroFilesArr.size)
ZeroFilesArr.print
ZeroFilesArr.clear
echo $(ZeroFilesArr.size)
ZeroFilesArr.push_back File1
ZeroFilesArr.push_back File2
echo $(ZeroFilesArr.size)
ZeroFilesArr.print
ZeroFilesArr.clear

输出如下

#kernel_coverage.sh

第3

File1 File2 File3

0

2

File1 File2

但后来我做了以下事情:

#   Kernel Objects
#   KSH Array <<FILES>> Contains strings that represent
#   the objects that are published in the Kernel
set -A FILES $(ls /dev/daKernel/)

function CEILING {
    local DIVIDEND=$1
    local DIVISOR=$2
    let RESULT=$((((${DIVIDEND} + ${DIVISOR}) - 1)/${DIVISOR}))
    echo ${RESULT}
}

#   Checks if the Parameter passed is 
#   a published object of the Kernel and returns
#   the file size
#   Returns a string with the size
function ZERO_FILE_CHECK {
    local kernel_path="/dev/daKernel"
    local FILE_NAME="$kernel_path/$1"
    local retval=$(ls -l ${FILE_NAME} | awk {'print $5'})
    echo $retval
}

#   Checks and returns a statistic of how 
#   many files are in zero in the filesystem
#   I.E. 3 out of 100 would return 3
function ZERO_FIlES_CHECK {
    local let FILES_SIZE=${#FILES[@]}
    local COUNTER=0;
    for f in "${FILES[@]}"
    do
        local let n=$(ZERO_FILE_CHECK $f)
        if [ $n -eq 0 ]; then
            let COUNTER=$(($COUNTER+1)) 
        fi
    done
    local PERCENTAGE=0
    let PERCENTAGE=$(($COUNTER * 100))
    let PERCENTAGE=$(CEILING $PERCENTAGE $FILES_SIZE)
    echo $PERCENTAGE
}

#   Check if the files are not in zero
#   Input: An expected percentage, if bigger than 
#   this then there are too many files in zero size
#   Depends on: ZERO_FIlES_CHECK and the FILES array
#   Returns: 0 (Success) or 1 (Failure)
function CHECK_FILES {
    local let default_percentage=$1
    local let ZEROFILE_PERCENTAGE=$(ZERO_FIlES_CHECK)
    if [[ $ZEROFILE_PERCENTAGE -ge $default_percentage ]]; then
        return 0;
    else
        return 1;
    fi  
}

它也有效,它会返回一个文件夹是否包含过多的文件。所以我虽然已经全力以赴,并且在通过野生支气管的幸福之路上。

但我错了。

我把我神奇的push_back放在ZERO_FIlES_CHECK函数中,如下所示:

function ZERO_FIlES_CHECK {
    local let FILES_SIZE=${#FILES[@]}
    local COUNTER=0;
    for f in "${FILES[@]}"
    do
        local let n=$(ZERO_FILE_CHECK $f)
        if [ $n -eq 0 ]; then
            let COUNTER=$(($COUNTER+1)) 
            ZeroFilesArr.push_back $f
        fi
    done
    local PERCENTAGE=0
    let PERCENTAGE=$(($COUNTER * 100))
    let PERCENTAGE=$(CEILING $PERCENTAGE $FILES_SIZE)
    echo $PERCENTAGE
}

并使用强制它来查找零点

中的最轻微文件进行测试
if CHECK_FILES 0; then
    ZeroFilesArr.print
    echo $(ZeroFilesArr.size)
fi
ZeroFilesArr.clear
if CHECK_FILES 0; then
    ZeroFilesArr.print
    echo $(ZeroFilesArr.size)
fi

但它始终打印以下内容:

#kernel_coverage.sh

**这里有一个空格,表示NULL **

0

**这里有一个空格,表示NULL **

0

在尝试了几种方法后,我被烧毁了,似乎我无法想出一个明确的解决方案

非常感谢任何帮助

我认为我对变量作用域存在问题,但我认为全局变量就像其他地方一样。

1 个答案:

答案 0 :(得分:1)

问题比那个

更大

因为我正在重新发明轮子所以存在设计问题。

find $kernel_path -size 0 ! -type d | sed -e "s!$kernel_path/!!")

这将为您提供没有/path/name/.../且没有文件夹的零大小文件列表

所以我的代码变得更加苗条,因为现在我只使用那个发现

与矢量相关的所有东西都被炸成碎片,ZERO_FILES_CHECK现在如下所示

#   Checks and returns a statistic of how 
#   many files are in zero in the filesystem
#   I.E. 3 out of 100 would return 3
function ZERO_FILES_CHECK {
    set -A FILES $(find $kernel_path -size 0 ! -type d | sed -e "s!$kernel_path/!!")
    set -A ALLFILES $(ls /dev/daKernel/)
    local COUNTER=0;
    local PERCENTAGE=0
    local let FILES_SIZE=${#ALLFILES[@]}
    let PERCENTAGE=$((${#FILES[@]} * 100))
    let PERCENTAGE=$(CEILING $PERCENTAGE $FILES_SIZE)
    echo $PERCENTAGE
}

CEILING和CHECK_FILES功能保持不变,其余功能死亡。

bash方式更好