微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为UNIX编写了bash代码以充当回收站卡在传递参数到测试函数上

如何解决为UNIX编写了bash代码以充当回收站卡在传递参数到测试函数上

我为UNIX的recyclebin文件编写了代码。当我bash recyclebin -i filename时, 它读取文件名之前传递的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 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,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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。