我在 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
文件 1 文件 2 文件 3
0
2
文件 1 文件 2
但后来我做了以下事情:
# 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
在尝试了几种方法后我筋疲力尽,似乎我无法想出一个明确的解决方案
任何帮助将不胜感激
我在想我的变量范围有问题,但我认为全局变量就像其他任何地方一样是全局变量。