2013-11-01 33 views
0

我在KSH 88寫了一個簡單陣列內不工作時,也做了以下內容:Shell函數元素添加到陣列放置在另一個功能

# 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

文件1文件2文件3

文件1文件2

乙UT之後,我做了以下內容:

# 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

**空的空間在這裏指明空**

**空的空間在這裏指明空**

嘗試幾種方法後,我我燒燬了,似乎我不能拿出一個明確的解決方案

任何幫助將是偉大的我很欣賞

我在想,我有一個變量範圍的問題,但我雖然全球像其他地方一樣是全局變量。

回答

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 
} 

天花板和CH ECK_FILES功能保持不變,其餘的都死了。

bash的方式是更好的方式

+0

不必要的'$(LS的/ dev/daKernel /)'子進程,可能只是'的/ dev/daKernel/*'。順便說一句,你不再需要「讓」了。 – cdarke

+0

謝謝@cdarke – Claudiordgz

相關問題