使用Bash中的函数进行反转

时间:2014-09-22 00:43:50

标签: 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
        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

1 个答案:

答案 0 :(得分:3)

您的代码存在两个大问题:

  1. 分配给mydir时,您可能希望复制整个数组。但是您指定$arr,这与仅指定第一个元素${arr[0]}相同。引用Arrays section of man bash

      

    引用不带下标的数组变量相当于使用下标0引用。

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

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

  3. 第二点强烈暗示我你不知道你在做什么,而你只是从某个地方复制粘贴的部分脚本。我不会为你编写代码。如果您了解Bash的基础知识,那么这很容易做到。如果你不这样做,去学习它们。您将不会通过从Stack Overflow或其他站点复制粘贴ad-hoc片段来学习任何内容。下次,你会再次问几乎同样的问题。我们不是为您做功课,我们来teach you

    还有一些小问题,但在功能方面仍然非常严重。

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

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

    • 无论你在shell中扩展变量,你都应该在双引号中扩展它,除非你有充分的理由不这样做,你知道你在做什么。如果你在双引号之外扩展它,你将遇到逃避错误的麻烦。 Double quotes保护内部的大多数特殊字符不被shell解释,只允许变量,命令,算术和历史扩展。

    • reverse的循环中,i应包含一个数字。测试字符串是否与[相等是无稽之谈。这种情况总是错误的。

    • 您永远不会初始化var变量,但您会在echo正文末尾的reverse语句中使用其值。

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

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

    即使你是一个shell初学者,我已经告诉你足够了解reverse的正确实现。如果您再次阅读Arrays section of Bash manual,一切都应该清楚。如果不是,请发表评论,我会尽力给你更多指导。