在bash脚本中调用函数时出现问题

在bash脚本中调用函数时出现问题,bash,Bash,我一直在做我们的简介脚本任务,在脚本中调用函数时遇到问题。我正处于作业的第二部分,我只是在测试,以确保我所拥有的(希望)能够发挥作用。我收集了一些目录,问了一个是或否的问题。当我得到一个“y”时,我写了一个我调用的小函数,当我得到一个“n”时,我有另一个函数,都是简单的回音。问题是什么 part_two(){ answer="" for value in "$@";do echo "$value" while [ "$answer" != "y" -a "

我一直在做我们的简介脚本任务,在脚本中调用函数时遇到问题。我正处于作业的第二部分,我只是在测试,以确保我所拥有的(希望)能够发挥作用。我收集了一些目录,问了一个是或否的问题。当我得到一个“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";
}

如有任何帮助,我们将不胜感激。

就像在C中一样,函数必须在使用前定义好。在您的代码片段中,在声明这两个函数之前,您正在调用第二部分(即调用第五部分和第六部分)

您是否尝试将它们的定义移动到脚本的开头

编辑:

在大多数情况下,在Bash中处理此问题的最佳方法是在执行任何实际命令之前,在脚本的开头定义所有函数。定义的顺序并不重要——shell只在函数即将使用时才查找它——因此通常不存在依赖性问题等,您可能需要考虑这些问题

编辑2:

在某些情况下,您可能无法仅在脚本开始时定义函数。一种常见情况是使用条件构造动态选择或修改函数声明,例如:

if [[ "$1" = 0 ]]; then
    function show() {
        echo Zero
    }
else
    function show() {
        echo Not-zero
    }
fi
在这些情况下,您必须确保每个函数调用都是在声明该函数(以及它调用的任何其他函数)之后进行的

编辑3:

在bash中,函数声明实际上是定义其实现的
function foo(){…}
块-是的,
function
关键字不是严格必需的。没有C语言中的函数原型——它们无论如何都没有意义,因为shell脚本通常在执行时进行解析。较新的Bash版本确实可以一次读取脚本,但它们主要检查语法错误,而不是像这样的逻辑错误


顺便说一句,官方术语是“函数声明”,但即使是Bash信息页面也可以互换地使用“声明”和“定义”。

与C中的类似,函数在使用之前必须先定义。在您的代码片段中,在声明这两个函数之前,您正在调用第二部分(即调用第五部分和第六部分)

您是否尝试将它们的定义移动到脚本的开头

编辑:

在大多数情况下,在Bash中处理此问题的最佳方法是在执行任何实际命令之前,在脚本的开头定义所有函数。定义的顺序并不重要——shell只在函数即将使用时才查找它——因此通常不存在依赖性问题等,您可能需要考虑这些问题

编辑2:

在某些情况下,您可能无法仅在脚本开始时定义函数。一种常见情况是使用条件构造动态选择或修改函数声明,例如:

if [[ "$1" = 0 ]]; then
    function show() {
        echo Zero
    }
else
    function show() {
        echo Not-zero
    }
fi
在这些情况下,您必须确保每个函数调用都是在声明该函数(以及它调用的任何其他函数)之后进行的

编辑3:

在bash中,函数声明实际上是定义其实现的
function foo(){…}
块-是的,
function
关键字不是严格必需的。没有C语言中的函数原型——它们无论如何都没有意义,因为shell脚本通常在执行时进行解析。较新的Bash版本确实可以一次读取脚本,但它们主要检查语法错误,而不是像这样的逻辑错误


顺便说一句,官方术语是“函数声明”,但即使是Bash信息页面也可以互换使用“声明”和“定义”。

除非你告诉我们你正在经历的不想要的行为,否则我们无法告诉你这个问题。除非你告诉我们你正在经历的不想要的行为,否则我们无法告诉你这个问题。谢谢。我们在课堂上讨论了函数,但只是暂时没有意识到它们需要定义。@wienerdog先生:换句话说,将这一行移到底部:
第二部分$@
。谢谢。我们在课堂上讨论了函数,但只是一时,没有意识到它们需要定义。@wienerdog先生:换句话说,将这一行移到底部:
第二部分$@