Linux 在Bash中使用函数进行反转

Linux 在Bash中使用函数进行反转,linux,bash,fedora,Linux,Bash,Fedora,我正在尝试在Bash中创建一个reverse函数,其中它将使用main函数和reverse函数反转一个目录或一个项目数组作为参数。我认为我的main函数出错了,或者我无法调用我创建的reverse函数。我对Bash也不是很熟悉 #!/bin/bash function reverse(){ input=$1 #1st parameter copy=${input} len=${#copy} for((i=$len-1;i>=0;i--)); do

我正在尝试在Bash中创建一个
reverse
函数,其中它将使用
main
函数和
reverse
函数反转一个目录或一个项目数组作为参数。我认为我的
main
函数出错了,或者我无法调用我创建的
reverse
函数。我对Bash也不是很熟悉

#!/bin/bash
function reverse(){
    input=$1     #1st parameter
    copy=${input}
    len=${#copy}
    for((i=$len-1;i>=0;i--)); do
        if [ $i = "[" ]; then
             continue
        fi
        rev="$rev${copy:$i:1}"
    done
    echo "var: $var, rev: $rev"
}

function main(){
    arr=( tiger lion bear )
    mydir = $arr
    reverse $mydir
    echo $reverse
    # should print: bear lion tiger
}

main

您的代码有两个大问题:

  • 分配给
    mydir
    时,可能需要复制整个数组。但是您分配
    $arr
    ,这与只分配第一个元素
    ${arr[0]}
    相同。引述:

    引用不带下标的数组变量等同于引用下标为0的数组变量

    您应该使用
    mydir=(“${arr[@]}”)
    to,然后使用类似的构造将整个数组传递给
    reverse
    函数。但是您根本不必复制数组,这个
    main
    就足够了:

    function main(){
        arr=( tiger lion bear )
        reverse "${arr[@]}"
    }
    
  • reverse
    的实现会反转其第一个参数中的字母,即现在所称的
    arr
    数组的第一项。您应该反转数组。它将存储在函数的参数中。您可以通过
    params=(“$@”)
    params
    数组的形式获取函数的所有参数

  • 第二点强烈地暗示我,你不知道你在做什么,你只是从某处复制脚本的粘贴部分。我不会为你写代码。如果你知道基本的知识,这真的很容易做到。如果你没有,就去学吧。通过从堆栈溢出或其他站点复制粘贴临时代码段,您将一无所获。下次,你会再次提出几乎相同的问题。我们不是来给你做作业的,我们是来给你做作业的

    还有一些小问题,但在功能方面仍然相当严重


    • shell中变量赋值的
      =
      周围不能有空格。分配给
      mydir
      时,它们位于
      main
      中。这就是为什么Bash可能会打印一个错误,说明它找不到任何名为
      mydir
      的命令。每个shell将命令行拆分为多个单词,并将第一个单词作为命令名

    • 您的
      reverse
      函数不必要地复制
      输入
      变量–当然,除非您真的想像现在这样在末尾打印原始值。但是,我宁愿将内容复制到名为
      original
      的变量中,然后处理
      input
      变量,因为这样会更容易理解其意图

    • 在shell中展开变量的任何地方,都应该在双引号内展开它,除非您有充分的理由这样做,并且您知道自己在做什么。如果将其展开到双引号之外,则会遇到转义错误的问题。保护内部大多数特殊字符不被shell解释,只允许变量、命令、算术和历史扩展

    • reverse
      中的循环中,
      i
      应该包含一个数字。测试字符串是否等于
      [
      ,这是毫无意义的。这种情况总是错误的

    • 您从不初始化
      var
      变量,但在
      reverse
      正文末尾的
      echo
      语句中使用它的值

      在首次使用
      rev
      变量之前,您也不会指定该变量的值。由于默认情况下所有变量都为空,并且您只使用了一次
      reverse
      ,因此这不是一个问题,但仍然不是一个好的做法

      另一个没有初始化的变量是
      reverse
      ,位于
      main
      的最后一行。shell中的函数调用只返回状态,与任何其他命令类似。您可以修改(全局)函数中的变量,但您不这样做。因此,
      main
      末尾的
      echo
      命令是无用的


    即使你是一个shell初学者,我已经告诉了你足够多的信息来找出
    reverse
    的正确实现。如果你再次阅读,一切都应该是清楚的。如果不是,请评论,我将尝试给你更多的指导。

    @Palec输出应该是数组或目录中每个成员的反转。所以对于考试来说如果你有“老虎-狮子-熊”,它会返回“熊-狮子-老虎”。我不需要反转看起来的单词,但需要重新定位它们?在shell的变量赋值中,在
    =
    周围不能有空格。当赋值到
    mydir
    @Palec时,它们在
    main
    中。感谢您指出这一点。它现在正在工作。但是,我只需要找出如何按顺序反转它们d不是按字符。你能将它们存储在数组中并在bash中向后打印位置吗?你将它们存储在数组中,是的,你可以直接对它们进行索引,是的,这意味着你可以得到数组的长度,并以相反的方式填充新的数组。@Palec这是一个一般性的问题,不是针对你,而是针对一般的since我不熟悉bash,我只是想了解更多信息,以便我能自己理解和理解并学习。我不是要求任何人帮我解决这个问题,而是要求提供一些提示或一些事情的解释。你有没有任何资源或链接,我可以参考你认为有用的bash?不是bash参考手册或者。非常感谢您提供的所有这些详细信息,而不是为我写的。我是一个初学者,在这里使用bash和一些语法和方法,而不是其他语言,有时会让我绊倒。我真的很感谢您的详细解释和参考手册。总的来说,我只是想学习,因为我从长远来看,这将使我受益终生,但我想看看我是否