Linux 有关复制文件的bash脚本的帮助

Linux 有关复制文件的bash脚本的帮助,linux,bash,shell,copy,Linux,Bash,Shell,Copy,我对linux和bash编程/脚本都是新手。 无论如何,我想制作一个bash脚本,它可以做一些事情: 将获取要复制的文件的输入 将获取dest文件夹 将要求她复制或移动 将执行所需的操作 将在最后询问是否继续进行另一项操作 至于第2、3、5部分,我没问题,但第1部分有点问题。 所以,这是剧本,我希望你能告诉我我错在哪里,为什么:) 现在我的主要问题是没有数据记录到cop变量中,因此cp没有任何可复制的内容。 也许我应该使用其他循环,但我仍然不知道如何使用其他循环。您可能希望使用数组。我已经重写了

我对linux和bash编程/脚本都是新手。 无论如何,我想制作一个bash脚本,它可以做一些事情:

  • 将获取要复制的文件的输入
  • 将获取dest文件夹
  • 将要求她复制或移动
  • 将执行所需的操作
  • 将在最后询问是否继续进行另一项操作
  • 至于第2、3、5部分,我没问题,但第1部分有点问题。 所以,这是剧本,我希望你能告诉我我错在哪里,为什么:)

    现在我的主要问题是没有数据记录到cop变量中,因此
    cp
    没有任何可复制的内容。
    也许我应该使用其他循环,但我仍然不知道如何使用其他循环。

    您可能希望使用数组。我已经重写了您代码的某些部分:

    #!/bin/bash
    
    clear
    f=0
    cop=()
    
    abort() {
        echo >&2 "Something went wrong ($@)."
        echo >&2 "Do you have a banana jammed in the keyboard?"
        exit 1
    }
    
    Beginning() {
        echo "HELLO $USER , THIS PROGRAM WILL COPY THE FILES YOU WANT TO YOUR DESIRED DESTINATION DIRECTORY"
        echo "please enter the filename/s you want to copy:"
        EnteringF
    }
    
    EnteringF() {
        local i=$((${#cop[@]}+1))
        IFS= read -r -e -p " filename$i: " f || abort "EnteringF"
        cop+=( "$f" )
        Confirm
    }
    
    Confirm() {
        local ans
        read -e -p "do you wish to copy another file (y/n)? " ans || abort "Confirm"
        if [[ "${ans,,}" = y ]]; then
            EnteringF
        elif [[ "${ans,,}" = "n" ]]; then
            Destination
        else
            echo " invalid choice please try again "
            Confirm
        fi
    }
    
    Destination() {
        IFS= read -r -e -p "now please enter the destination folder: " dest || abort "Destination"
        CopyMove
    }
    
    CopyMove() { 
        read -r -e -p "Do you want to copy or move the file/s? please enter c/m? " choice || abort "CopyMove"
        if [[ "${choice,,}" = c ]]; then 
            if cp -v -- "${cop[@]}" "$dest"; then
                echo "copied successfully"
            else
                abort "cp"
            fi
            UseAgain 
        elif [[ "${choice,,}" = m ]] ; then 
            if mv -v -- "${cop[@]}" "$dest"; then
                echo "moved successfully"
            else
                abort "mv"
            fi
            UseAgain 
        else 
            echo " invalid choice please try again "
            CopyMove 
        fi
    }
    
    UseAgain() {
        read -e "Do you want to use the program again y/n? " confirm || abort "UseAgain"
        if [[ "${confirm,,}" = y ]]; then
            Beginning
            UseAgain
        elif [[ "${confirm,,}" = "n" ]]; then
            End
        else
            echo "invalid choice please try again";
            UseAgain
        fi
    }
    End() {
        clear
        echo "THANK YOU $USER FOR USING THIS PROGRAM :-)" 
    }
    
    Beginning
    
    我甚至不确定它是否有效,当我试图运行它时,我看到一个黑屏,屏幕上有一个可怕的提示,问我想复制或移动什么文件。我期待着一匹小马或者像一只会弹钢琴的猫这样很酷的东西。但是没有。实际上,我不知道我想移动什么文件。我甚至不确定我是否想移动文件。如果我想移动一个文件,我会直接使用
    mv
    。我用了一些巴西主义让你去挖掘

    关于变量cop的问题,我使用了一个数组,所以所有的问题一下子就解决了

    更重要的是,您的程序中存在一个巨大的设计缺陷:递归!太可怕了。你每一步都在堆叠,从不释放堆叠。你真的应该重新考虑你的设计!看:如果你调用你的程序
    lol\u pony\u cat
    ,如果你在终端中键入这个:

    yes '42' | ./lol_pony_cat
    
    你很快就会得到

    Segmentation fault
    
    那是因为:

    • 我们从头开始
    • 我们进入EnteringF并提示输入文件名:我们输入
      42
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,所以
    • 我们进入确认状态并提示输入是/否,但我们回答的是无效的
      42
      ,因此
    直到我们到达堆栈溢出


    祝你好运。

    请缩进你的代码,这样结构就容易看到。要复制move,为什么不直接使用
    mv
    cp
    ?这个脚本的目的是什么?@jkshah用户友好型?没有制表符完成,没有读线(好的,他会使用
    read-e
    ),如果文件名包含有趣的符号(空格、换行符、反斜杠、前导/尾随)、没有globs、没有选项
    cp
    mv
    可能有,等等
    :)
    是的,非常用户友好
    。说“你好,用户洛洛尔”不足以让它变得友好。+1因为我期待着一匹小马或者像猫弹钢琴一样酷的东西。英雄联盟谢谢!:)还没有检查。尽管如此,正如我所说,这是我的第一个脚本(之前有2个,但它们很简单),它是为了理解文字。现在,如果你能解释一下你做了什么,因为我不太明白。我仍然没有完全理解操作员在脚本编写中的角色。正如你所见,我并不真正了解数组以及如何使用它们。但我学到的是,我不需要每次都有回声。我可以使用“读取”和“保存”代码行。@user2948761最重要的是您了解导致堆栈溢出的设计缺陷。然后,阅读有关数组的内容。然后问我有关脚本中特定运算符的具体问题
    :)
    Segmentation fault