在bash脚本中调用函数时遇到问题

mrw*_*dog 1 bash

我一直在处理我们的介绍脚本编写任务,并且在调用脚本中的函数时遇到了问题.我在作业的第二部分,我只是在测试,以确保我所拥有的(希望)能够发挥作用.我收集了一些目录,并询问是或否.当我得到'y'时,我写了一个我调用的小函数,当我得到一个'n'时,我有另一个函数,两个简单的回声.有什么问题?

part_two(){
    answer=""
    for value in "$@";do
      echo "$value"
      while [ "$answer" != "y" -a "$answer" != "n" ]
      do 
        echo -n "Would you like to save the results to a file? (y/n): "
        read answer
      done
      if [ "$answer" = "n" ]
        then 
          part_six
      elif [ "$answer" = "y" ]
        then 
          part_five
      fi 
    done
}

part_two $@

part_five(){
    echo -n "working yes";
}

part_six(){
    echo -n "working no";
}
Run Code Online (Sandbox Code Playgroud)

一如既往,我们将非常感谢任何帮助.

thk*_*ala 9

就像在C中一样,必须在使用之前定义函数.在您的代码片段中,您在声明这两个函数之前调用part_two(调用part_five和part_six).

您是否尝试将其定义移至脚本的开头?

编辑:

在大多数情况下,在Bash中处理此问题的最佳方法是在执行任何实际命令之前简单地在脚本开头定义所有函数.定义的顺序并不重要 - shell只会在它即将使用它时查找一个函数 - 所以通常没有依赖性问题等你可能需要考虑.

编辑2:

某些情况下,您可能无法在脚本开头定义函数.一种常见的情况是当您使用条件结构动态选择或修改函数的声明时e..g.:

if [[ "$1" = 0 ]]; then
    function show() {
        echo Zero
    }
else
    function show() {
        echo Not-zero
    }
fi
Run Code Online (Sandbox Code Playgroud)

在这些情况下,必须确保在声明该函数(以及它调用的任何其他函数)之后发生每个函数调用.

编辑3:

在bash中,函数声明实际上是function foo() { ... }您定义其实现的块 - 是的,function关键字不是绝对必要的.没有像C中那样的函数原型 - 无论如何它们都没有意义,因为shell脚本通常在执行时被解析.较新的Bash版本会立即读取脚本,但它们主要检查语法错误,而不是检查逻辑错误,例如此错误.

BTW官方术语是"函数声明 ",但即使是Bash信息页也可以互换地使用"声明"和"定义".