Linux 为UNIX编写了一个bash代码,以充当recyclebin。无法将参数传递给测试函数

Linux 为UNIX编写了一个bash代码,以充当recyclebin。无法将参数传递给测试函数,linux,unix,recycle-bin,Linux,Unix,Recycle Bin,我为UNIX的reyclebin文件编写了一个代码。当我bash循环使用ebin-i文件名时, 它读取在文件名之前传递的getopts,然后调用test函数 并进入测试函数,但不进入函数内部的for循环。这个计划没有任何进展,我被困在那里了。有人帮忙吗?我做错什么了 #!bin/bash ### 2. creating directory ~/recyclebin in home if not present if [[ ! -d $HOME/recyclebin ]] then

我为UNIX的reyclebin文件编写了一个代码。当我bash循环使用ebin-i文件名时, 它读取在文件名之前传递的getopts,然后调用test函数 并进入测试函数,但不进入函数内部的for循环。这个计划没有任何进展,我被困在那里了。有人帮忙吗?我做错什么了

#!bin/bash

### 2. creating directory ~/recyclebin in home if not present
if [[ ! -d $HOME/recyclebin ]]
then
        mkdir $HOME/recyclebin
        #touch $HOME/.restore.info
fi

if [ -d $HOME/recyclebin ] && [ ! -e $HOME/.restore.info ]
then
        touch $HOME/.restore.info
fi

### 4. Test Conditions

function test() {
        for arg in $*
                do

                file=$arg

                ###No Filename Provided Error
                if [ $# -eq 0 ]
                then
                        echo "missing operand"
                        file="Error"
                        exit 1

                ###File Does Not Exist Error
                elif [ ! -e $file ]
                then
                        echo "Cannot delete $file: No such file exists"
                        file="Error"
                        exit 2

                ###Directory Name provided
                elif [ -d $file ]
                then
                        echo "Cannot delete $file : Not a file."
                        file="Error"
                        exit 3

                ###cannot delete any argument with recycle in it
                elif [[ "${file}" =~ .*"recycle".* ]]
                then
                        echo "Attempting to delete recycle – operation aborted"
                        file="Error"
                        exit 4
                fi

                processRequest
                done
}

processRequest(){
echo "Entered processRequest"
        if [ $noChoice = true ]
        then
                recycle

        elif [ $iOption = true ] && [ $vOption = true ]
        then
                read -p "recycle: remove file '$file' ? [y/n] " response

                case $response in
                        [yY]*)
                                recycle
                                echo "recycle: '$file' is removed";;
                        *)
                                continue ;;
                esac

        elif [ $iOption = true ]
        then
                read -p "recycle: remove file '$file' ? [y/n] " response

                case $response in
                        [yY]*)
                                recycle
                                echo "recycle: '$file' is removed";;
                        *)
                                continue ;;
                esac

        elif [ $vOption = true ]
        then
                recycle
                echo "removed '$file' to the Recycle Bin"
        fi
}


### Assigning the values of flename, absolute path  and inode to variable
### name, absolute_path and inode before sending it to recyclebin folder

recycle() {

        # If no errors mv the file to the recyclebin folder and add to .restore.info file.

    if [ $file != "Error" ] ; then
        name=$(basename ${file})                                                   #bcz file can be entered with full path
        path_cropped=$(readlink -e ${i} | cut -d"/" -f6-)
        path=$(dirname $(readlink -e ${i} | cut -d"/" -f6-))
        absolute_path="${HOME}/${path_cropped}"
        inode=$(stat -c '%i' ${file})
        filename=$name"_"$inode
        echo $newfilename:$fixedPath >> $HOME/.restore.info
        mv $file $recyclepath/$newfilename
    fi
}

###--------------------Starts from here after checking dir if exists or not--------------------------------------

        ###Declaring variables which further fulfills condition to act as i, v, r commands
        ###as i = iOption; v = vOption; no command = noChoice and recycle files recursively
        ### = r or R

        noChoice=true
        iOption=false
        vOption=false
        removeFolder=false

        while getopts ivrRvi opt
        do
                case $opt in
                        iv)
                                iOption=true
                                vOption=true
                                noChoice=false
                                break;;

                        vi)
                                iOption=true
                                vOption=true
                                noChoice=false
                                break;;

                        i)
                                iOption=true
                                noChoice=false
                                break;;

                        v)                                                                                                                     
                                vOption=true
                                noChoice=false
                                break;;

                        r)
                                removeFolder=true
                                break;;

                        R)
                                removeFolder=true
                                break;;
                esac
        done
        shift $(($OPTIND - 1))

### CAlling the test function to test all the mentioned conditioned inside the test function
        test



--------------------------------------------------------------------------
``` ```````````````````````````````````````````````````````````````
**Solved code** 

``` ```````````````````````````````````````````````````````````````



#!bin/bash

### 2. creating directory ~/recyclebin in home if not present

if [[ ! -d $HOME/recyclebin ]]
then
        mkdir $HOME/recyclebin
        #touch $HOME/.restore.info
fi


### Creating .restore.info file if file is not yet present in
### home directory

if [ -d $HOME/recyclebin ] && [ ! -e $HOME/.restore.info ]
then
        touch $HOME/.restore.info
fi

if [ $# -eq 0 ]
then
        echo "recycle: missing operand"
        exit 1
fi

### 4. Test Conditions to check

testCondition() {
        for arg in "$@"
                do

                file=$arg

                ###File Does Not Exist Error
                if [ ! -e "$file" ]
                then
                        echo "recycle: Cannot delete $file: No such file exists"
                        file="Error"
                        exit 2

                ###Directory Name provided
                elif [ -d $file ]
                then
                        echo "recycle: Cannot delete $file : Is a directory."
                        file="Error"
                        exit 3

                ###cannot delete any argument with recycle in it
                elif [[ "${file}" =~ .*"recycle".* ]]
                then
                        echo "recycle: Attempting to delete – operation aborted"
                        file="Error"
                        exit 4
                fi

                processRequest $file
                done
}

processRequest(){

        if [[ "$noChoice" = true ]]
        then
                recycle $file

        elif [ "$iOption" = true ] && [ "$vOption" = true ]
        then
                echo "recycle: remove file '$file' ? [y/n] " 
                read response

                case $response in
                        [yY]*)
                                recycle $file
                                echo "recycle: '$file' is removed";;
                        *)
                                continue ;;
                esac
        elif [ "$iOption" = true ]
        then
                read -p "recycle: remove file '$file' ? [y/n] " response

                case $response in
                        [yY]*)
                                recycle $file
                                echo "recycle: '$file' is removed";;
                        *)
                                continue ;;
                esac

        elif [ "$vOption" = true ]
        then
                recycle $file
                echo "removed '$file' to the Recycle Bin"
        fi
}


### Assigning the values of flename, absolute path  and inode to variable
### name, absolute_path and inode before sending it to recyclebin folder

recycle() {

        # If no errors mv the file to the recyclebin folder and add to .restore.info file.

    if [[ ! $file == "Error" ]]
    then
        name=$(basename $file)                                                   #bcz file can be entered with full path
        path_cropped=$(readlink -e $file | cut -d"/" -f6-)
        absolute_path="${HOME}/${path_cropped}"
        inode=$(stat -c '%i' $file)
        filename=$name"_"$inode
        echo $filename:$absolute_path >> $HOME/.restore.info                    # saving filename:path/to/file in .restore.info
        mv $file $HOME/recyclebin/$filename                                     # movinf file as filename_inode to recyclebin
    fi
}

recFolder() {
        for arg in $*
        do
                dirPath=$(readlink -e "$arg")
                if [ -d "$dirPath" ]                                            # check if the current argument IS a directory
                then
                        if [[ $(ls "$dirPath" | wc -l) -eq 0 ]]                 #check to see if current directory is empty
                        then
                                rmdir $dirPath

                        else                                                    #if not an empty directory
                                findCurPathList=$(find $dirPath)                # to find all the subdirectories and files list inside directory
                                for file in $findCurPathList
                                do
                                        if [[ -f "$file" ]]                     #if it is a file
                                        then
                                                processRequest "$file"
                                        fi
                                done

                                #-----------------------------------------------Now in previous loop, once all the files are removed and saved in
                                                                                #recyclebinfolder and in .recycle.info file. Now delete the
                                                                                #empty subdirectories in second loop
                                for args1 in $findCurPathList
                                do
                                        if [[ -d $args1 ]]
                                        then
                                                if [[ $(ls $args1 | wc -l) -eq 0  ]]
                                                then
                                                        rmdir $args1
                                                fi
                                        fi
                                done

                                #if [[ $(ls "$arg" | wc -l) -eq 0 ]]                 #check to see if current directory is empty
                                #then
                                #       rmdir $dirPath
                                #fi
                        fi
                else                                                            # if NOT a directory then this executes
                        echo "recycle: not a directory"
                fi
        done
}

###--------------------Starts from here, after checking dir if exists or not--------------------------------------

        ###Declaring variables which further fulfills condition to act as i, v, r commands
        ###as i = iOption; v = vOption; no command = noChoice and recycle files recursively
        ### = r or R

        noChoice=true
        iOption=false
        vOption=false
        removeFolder=false

        while getopts ivrR opt
        do
                case $opt in

                        i)
                                iOption=true
                                noChoice=false;;

                        v)
                                vOption=true
                                noChoice=false;;

                        r)
                                removeFolder=true;;

                        R)
                                removeFolder=true;;

                        *)
                                echo "recycle: invalid input"
                                exit 1;;
                esac
        done
        shift $(($OPTIND - 1))

        ### Now checking if -r or -R is passed as an argument and the passed in file argument
        ### is either directory or existing file to continue

        if [[ "$removeFolder" == true ]]
        then
                for arg in "$@"
                do
                        inputArg=$arg

                        if [[ -d $inputArg || -e $inputArg ]]                           # if the user pass -r request but the argument could either be
                        #a directory o a file not directory
                        then
                                argList=$(find "$inputArg")

                                recFolder "$argList"
                        else
                                echo "recycle: $inputArg does not exist!"
                        fi
                done
        else

                ### CAlling the test function to test all the mentioned conditioned inside the test function
                testCondition "$@"

        fi


几乎可以肯定的是,您应该在“$@”中为arg使用
,而不是在$*
中为arg使用
——如果文件名包含空格,则使用哪一个非常重要。
if[$#-eq 0]
测试将不执行<只有当
$*
中没有名称时,code>$\
才会为零,如果
$*
中没有名称,则代码不会进入循环。定义函数时,通常最好避免使用关键字
function
。另外,请记住
test
是一个内置命令。编写函数
测试
就像踩在可怕的薄冰上。我不确定这是否是您的问题,但最好避免命名函数
test
,以免与内置函数混淆。我不确定这是你麻烦的原因。我确信它有可能在以后混淆代码的读者。我建议使用它来检查代码是否有错误。如何检查未调用函数
test
?如果像在脚本的最后一行中那样在没有参数的情况下调用它,它将不会做任何事情。您可以在
#之后添加一行
set-x
/bin/bash
(或更高版本),使shell在执行命令之前打印所有命令。在开始调用测试函数时,我忘了在代码的最后传递参数
test$*
。此外,我还将函数测试的名称更改为testCondition,因为测试也是UNX预定义的关键字。@ManiPabla请回答您的问题并显示您正在使用的确切代码,而不是描述对代码的更改。显示如何准确调用脚本以及预期和实际输出。