我在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
在尝试了几种方法后,我被烧毁了,似乎我无法想出一个明确的解决方案
非常感谢任何帮助
我认为我对变量作用域存在问题,但我认为全局变量就像其他地方一样。
答案 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方式更好